From 50d48ced2c635424b80eec253a0493c8c63d0962 Mon Sep 17 00:00:00 2001
From: Tor-Einar Skog <tor-einar.skog@nibio.no>
Date: Tue, 14 May 2019 13:16:18 +0200
Subject: [PATCH] Moving timezone config from code to system properties

---
 .../ForecastConfigurationController.java      |  6 +++---
 .../servlet/PointOfInterestController.java    | 17 ++++++++--------
 .../no/nibio/vips/logic/util/Globals.java     | 17 ----------------
 .../no/nibio/vips/logic/util/SystemTime.java  | 20 ++++++++++++++++++-
 4 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/ForecastConfigurationController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/ForecastConfigurationController.java
index 97d605dc..3e1904b4 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/ForecastConfigurationController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/ForecastConfigurationController.java
@@ -227,7 +227,7 @@ public class ForecastConfigurationController extends HttpServlet {
                         request.setAttribute("forecastConfiguration", forecastConfiguration);
                         request.setAttribute("formId", multipleNew ? "forecastConfigurationMultipleNewForm" : "forecastConfigurationForm");
                         request.setAttribute("multipleNew", multipleNew);
-                        request.getSession().setAttribute("availableTimeZones", Globals.availableTimeZones);
+                        request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                         request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                         // All organisms used for parent organism list
                         request.setAttribute("allCrops", em.createNamedQuery("Organism.findAllCrops").getResultList());
@@ -261,7 +261,7 @@ public class ForecastConfigurationController extends HttpServlet {
                     request.setAttribute("weatherStationPointOfInterests", em.createNamedQuery("PointOfInterestWeatherStation.findByActivityAndOrganizationId").setParameter("active", Boolean.TRUE).setParameter("organizationId", user.getOrganizationId()).getResultList());
                     request.setAttribute("forecastConfiguration", forecastConfiguration);
                     request.setAttribute("formId","forecastConfigurationForm");
-                    request.getSession().setAttribute("availableTimeZones", Globals.availableTimeZones);
+                    request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                     request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                     
                     request.setAttribute("allCrops", em.createNamedQuery("Organism.findAllCrops").getResultList());
@@ -355,7 +355,7 @@ public class ForecastConfigurationController extends HttpServlet {
                         request.setAttribute("vipsLogicUsers", em.createNamedQuery("VipsLogicUser.findAll").getResultList());
                         request.setAttribute("dateStart_dateFormat", formFields.get("dateStart").getDateFormat());
                         request.setAttribute("dateEnd_dateFormat", formFields.get("dateEnd").getDateFormat());
-                        request.getSession().setAttribute("availableTimeZones", Globals.availableTimeZones);
+                        request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                         request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                         request.setAttribute("modelInformations", em.createNamedQuery("ModelInformation.findAll").getResultList());
                         request.setAttribute("forecastConfiguration", forecastConfiguration);
diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/PointOfInterestController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/PointOfInterestController.java
index 4e233a9e..20676a24 100755
--- a/src/main/java/no/nibio/vips/logic/controller/servlet/PointOfInterestController.java
+++ b/src/main/java/no/nibio/vips/logic/controller/servlet/PointOfInterestController.java
@@ -52,6 +52,7 @@ import no.nibio.vips.logic.entity.WeatherForecastProvider;
 import no.nibio.vips.logic.i18n.SessionLocaleUtil;
 import no.nibio.vips.gis.GISUtil;
 import no.nibio.vips.logic.util.Globals;
+import no.nibio.vips.logic.util.SystemTime;
 import no.nibio.web.forms.FormField;
 import no.nibio.web.forms.FormValidation;
 import no.nibio.web.forms.FormValidationException;
@@ -170,7 +171,7 @@ public class PointOfInterestController extends HttpServlet {
                     {
                         request.getSession().setAttribute("weatherStation", weatherStation);
                     }
-                    request.getSession().setAttribute("availableTimeZones", Globals.availableTimeZones);
+                    request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                     request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                     request.setAttribute("defaultMapCenter",user.getOrganizationId().getDefaultMapCenter());
                     request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
@@ -191,7 +192,7 @@ public class PointOfInterestController extends HttpServlet {
                         request.setAttribute("defaultMapCenter",user.getOrganizationId().getDefaultMapCenter());
                         request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
                         request.getSession().setAttribute("dataSources", SessionControllerGetter.getPointOfInterestBean().getWeatherStationDataSources());
-                        request.getSession().setAttribute("availableTimeZones", Globals.availableTimeZones);
+                        request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                         request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                         request.getSession().setAttribute("availableCountries", em.createNamedQuery("Country.findAll").getResultList());
                         request.getSession().setAttribute("defaultCountryCode", user.getOrganizationId().getCountryCode().getCountryCode());
@@ -232,7 +233,7 @@ public class PointOfInterestController extends HttpServlet {
                         request.setAttribute("defaultMapCenter",user.getOrganizationId().getDefaultMapCenter());
                         request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
                         request.getSession().setAttribute("dataSources", SessionControllerGetter.getPointOfInterestBean().getWeatherStationDataSources());
-                        request.getSession().setAttribute("availableTimeZones", Globals.availableTimeZones);
+                        request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                         request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                         request.getSession().setAttribute("availableCountries", em.createNamedQuery("Country.findAll").getResultList());
                         request.getSession().setAttribute("defaultCountryCode", user.getOrganizationId().getCountryCode().getCountryCode());
@@ -363,7 +364,7 @@ public class PointOfInterestController extends HttpServlet {
                             request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
                             request.setAttribute("returnURL","weatherStation?organizationId=" + user.getOrganizationId().getOrganizationId());
                             request.getSession().setAttribute("dataSources", SessionControllerGetter.getPointOfInterestBean().getWeatherStationDataSources());
-                            request.getSession().setAttribute("availableTimeZones", Globals.availableTimeZones);
+                            request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                             request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                             request.getSession().setAttribute("availableCountries", em.createNamedQuery("Country.findAll").getResultList());
                             request.getSession().setAttribute("defaultCountryCode", user.getOrganizationId().getCountryCode().getCountryCode());
@@ -508,7 +509,7 @@ public class PointOfInterestController extends HttpServlet {
                 {
                     PointOfInterest poi = SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(Integer.valueOf(pointOfInterestId));
                     request.getSession().setAttribute("poi", poi);
-                    request.getSession().setAttribute("availableTimeZones", Globals.availableTimeZones);
+                    request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                     request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                     request.setAttribute("defaultMapCenter",user.getOrganizationId().getDefaultMapCenter());
                     request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
@@ -528,7 +529,7 @@ public class PointOfInterestController extends HttpServlet {
                         request.setAttribute("returnIdCallback", request.getParameter("returnIdCallback") != null ? request.getParameter("returnIdCallback") :"");
                         request.setAttribute("defaultMapCenter",user.getOrganizationId().getDefaultMapCenter());
                         request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
-                        request.getSession().setAttribute("availableTimeZones", Globals.availableTimeZones);
+                        request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                         request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                         request.getSession().setAttribute("weatherForecastProviders", em.createNamedQuery("WeatherForecastProvider.findAll").getResultList());
                         request.getSession().setAttribute("availableCountries", em.createNamedQuery("Country.findAll").getResultList());
@@ -568,7 +569,7 @@ public class PointOfInterestController extends HttpServlet {
                         request.getSession().setAttribute("poi", poi);
                         request.setAttribute("defaultMapCenter",user.getOrganizationId().getDefaultMapCenter());
                         request.setAttribute("defaultMapZoom", user.getOrganizationId().getDefaultMapZoom());
-                        request.getSession().setAttribute("availableTimeZones", Globals.availableTimeZones);
+                        request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                         request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                         request.getSession().setAttribute("weatherForecastProviders", em.createNamedQuery("WeatherForecastProvider.findAll").getResultList());
                         request.getSession().setAttribute("availableCountries", em.createNamedQuery("Country.findAll").getResultList());
@@ -727,7 +728,7 @@ public class PointOfInterestController extends HttpServlet {
                                 request.setAttribute("returnURL","poi?organizationId=" + user.getOrganizationId().getOrganizationId());
                                 // Finding all external resources where entry is missing
                                 request.setAttribute("unreferencedExternalResources", SessionControllerGetter.getPointOfInterestBean().getUnusedExternalResourcesForPointOfInterest(poi));
-                                request.getSession().setAttribute("availableTimeZones", Globals.availableTimeZones);
+                                request.getSession().setAttribute("availableTimeZones", SystemTime.getAvailableTimeZones());
                                 request.getSession().setAttribute("defaultTimeZoneId", user.getOrganizationId().getDefaultTimeZone());
                                 request.getSession().setAttribute("availableCountries", em.createNamedQuery("Country.findAll").getResultList());
                                 request.getSession().setAttribute("defaultCountryCode", user.getOrganizationId().getCountryCode().getCountryCode());
diff --git a/src/main/java/no/nibio/vips/logic/util/Globals.java b/src/main/java/no/nibio/vips/logic/util/Globals.java
index 611470bd..fa4bac9a 100755
--- a/src/main/java/no/nibio/vips/logic/util/Globals.java
+++ b/src/main/java/no/nibio/vips/logic/util/Globals.java
@@ -67,23 +67,6 @@ public class Globals {
     public static String defaultTimestampFormat = "yyyy-MM-dd HH:mm:ssXXX";
     public static String defaultDateFormat = "yyyy-MM-dd";
     
-    // TODO: Move out of code and into config
-    public static String[] availableTimeZones = {
-        "UTC",
-        "Etc/GMT-1",
-        "Europe/Copenhagen",
-        "Europe/Oslo",
-        "Europe/Sarajevo",
-        "Europe/Stockholm",
-        "Europe/Helsinki",
-        "Europe/Riga",
-        "Europe/Vilnius",
-        "Europe/Sofia",
-        "Europe/Zurich",
-        "America/Los_Angeles"
-        
-    };
-    
     public static int DEFAULT_UUID_VALIDITY_DURATION_DAYS = 30;
     
     public static String PROTOCOL = System.getProperty("no.nibio.vips.logic.VIPSLOGIC_PROTOCOL");
diff --git a/src/main/java/no/nibio/vips/logic/util/SystemTime.java b/src/main/java/no/nibio/vips/logic/util/SystemTime.java
index 06fb8b70..e0a545df 100755
--- a/src/main/java/no/nibio/vips/logic/util/SystemTime.java
+++ b/src/main/java/no/nibio/vips/logic/util/SystemTime.java
@@ -21,8 +21,11 @@ package no.nibio.vips.logic.util;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -38,7 +41,7 @@ public final class SystemTime {
 
     private static Integer SYSTEM_TIME_OFFSET_MONTHS;
     private final static Calendar cal = Calendar.getInstance();
-    
+    private static String[] availableTimeZones;
     public static Date getSystemTime()
     {
         if(SYSTEM_TIME_OFFSET_MONTHS == null)
@@ -94,4 +97,19 @@ public final class SystemTime {
         }
     }
     
+    /**
+     * Using the system config "no.nibio.vips.logic.AVAILABLE_TIMEZONES" to 
+     * generate the available timezones in lists in this VIPSLogic instance
+     * UTC is always included
+     * @return 
+     */
+    public static String[] getAvailableTimeZones(){
+        if(SystemTime.availableTimeZones == null)
+        {
+            List<String> tmp = System.getProperty("no.nibio.vips.logic.AVAILABLE_TIMEZONES") != null ? new ArrayList(Arrays.asList(System.getProperty("no.nibio.vips.logic.AVAILABLE_TIMEZONES").split(","))) : new ArrayList<>();
+            tmp.add("UTC");
+            SystemTime.availableTimeZones = tmp.toArray(new String[tmp.size()]);
+        }
+        return SystemTime.availableTimeZones;
+    }
 }
-- 
GitLab