From 8f1fd0066a7ca5bf20aa71b4690fa5752076c85e Mon Sep 17 00:00:00 2001 From: Tor-Einar Skog <tor-einar.skog@nibio.no> Date: Tue, 27 Aug 2024 14:43:48 +0200 Subject: [PATCH] Add selection of grid weather datasource to organization form --- .../servlet/OrganizationController.java | 10 ++++++++++ .../session/PointOfInterestBean.java | 9 +++++++++ .../entity/WeatherStationDataSource.java | 11 ++++++++++ .../V20__Add_Datasource_Property_IsGrid.sql | 3 +++ .../vips/logic/i18n/vipslogictexts.properties | 1 + .../logic/i18n/vipslogictexts_bs.properties | 1 + .../logic/i18n/vipslogictexts_hr.properties | 1 + .../logic/i18n/vipslogictexts_nb.properties | 1 + .../logic/i18n/vipslogictexts_sr.properties | 1 + .../i18n/vipslogictexts_zh_CN.properties | 1 + .../formdefinitions/organizationForm.json | 6 ++++++ .../webapp/templates/organizationForm.ftl | 20 +++++++++++++++---- 12 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/db/migration/V20__Add_Datasource_Property_IsGrid.sql diff --git a/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationController.java b/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationController.java index b10c713a..ed2e9fd7 100644 --- a/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationController.java +++ b/src/main/java/no/nibio/vips/logic/controller/servlet/OrganizationController.java @@ -29,6 +29,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import no.nibio.vips.gis.GISUtil; import no.nibio.vips.gis.LonLatStringFormatException; +import no.nibio.vips.logic.controller.session.PointOfInterestBean; import no.nibio.vips.logic.controller.session.UserBean; import no.nibio.vips.logic.entity.Organization; import no.nibio.vips.logic.entity.VipsLogicUser; @@ -46,6 +47,9 @@ public class OrganizationController extends HttpServlet { @EJB UserBean userBean; + + @EJB + PointOfInterestBean poiBean; /** * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. @@ -101,6 +105,7 @@ public class OrganizationController extends HttpServlet { request.setAttribute("countries", userBean.getCountries()); request.setAttribute("timeZones", TimeZone.getAvailableIDs()); request.setAttribute("organization", organization); + request.setAttribute("gridWeatherDataSources", poiBean.getGridWeatherStationDataSources()); request.getRequestDispatcher("/organizationForm.ftl").forward(request, response); } else if(action.equals("organizationFormSubmit")) @@ -142,6 +147,11 @@ public class OrganizationController extends HttpServlet { : new GISUtil().getJtsPointFromString(formValidation.getFormField("defaultMapCenter").getWebValue()) ); + organization.setDefaultGridWeatherStationDataSource( + formValidation.getFormField("defaultGridWeatherStationDataSourceId").getValueAsInteger() < 0 ? + null + : poiBean.getWeatherStationDataSource(formValidation.getFormField("defaultGridWeatherStationDataSourceId").getValueAsInteger()) + ); organization = userBean.storeOrganization(organization); response.sendRedirect( diff --git a/src/main/java/no/nibio/vips/logic/controller/session/PointOfInterestBean.java b/src/main/java/no/nibio/vips/logic/controller/session/PointOfInterestBean.java index 7c82e925..b7f95ffa 100755 --- a/src/main/java/no/nibio/vips/logic/controller/session/PointOfInterestBean.java +++ b/src/main/java/no/nibio/vips/logic/controller/session/PointOfInterestBean.java @@ -263,10 +263,19 @@ public class PointOfInterestBean { return kml; } + public WeatherStationDataSource getWeatherStationDataSource(Integer weatherStationDataSourceId) + { + return em.find(WeatherStationDataSource.class, weatherStationDataSourceId); + } + public List<WeatherStationDataSource> getWeatherStationDataSources() { return em.createNamedQuery("WeatherStationDataSource.findAll").getResultList(); } + public List<WeatherStationDataSource> getGridWeatherStationDataSources() { + return em.createNamedQuery("WeatherStationDataSource.findGridSources").getResultList(); + } + public PointOfInterestWeatherStation storeWeatherStation(PointOfInterestWeatherStation weatherStation) { weatherStation = em.merge(weatherStation); return weatherStation; diff --git a/src/main/java/no/nibio/vips/logic/entity/WeatherStationDataSource.java b/src/main/java/no/nibio/vips/logic/entity/WeatherStationDataSource.java index 9fe247f2..de26e921 100755 --- a/src/main/java/no/nibio/vips/logic/entity/WeatherStationDataSource.java +++ b/src/main/java/no/nibio/vips/logic/entity/WeatherStationDataSource.java @@ -40,6 +40,7 @@ import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement @NamedQueries({ @NamedQuery(name = "WeatherStationDataSource.findAll", query = "SELECT w FROM WeatherStationDataSource w"), + @NamedQuery(name = "WeatherStationDataSource.findGridSources", query = "SELECT w FROM WeatherStationDataSource w WHERE w.isGrid IS TRUE"), @NamedQuery(name = "WeatherStationDataSource.findByWeatherStationDataSourceId", query = "SELECT w FROM WeatherStationDataSource w WHERE w.weatherStationDataSourceId = :weatherStationDataSourceId"), @NamedQuery(name = "WeatherStationDataSource.findByName", query = "SELECT w FROM WeatherStationDataSource w WHERE w.name = :name"), @NamedQuery(name = "WeatherStationDataSource.findByDefaultDescription", query = "SELECT w FROM WeatherStationDataSource w WHERE w.defaultDescription = :defaultDescription"), @@ -68,6 +69,16 @@ public class WeatherStationDataSource implements Serializable { @Size(max = 1024) @Column(name = "info_uri_expression") private String infoUriExpression; + @Column(name = "is_grid") + private Boolean isGrid; + + public Boolean getIsGrid() { + return isGrid; + } + + public void setIsGrid(Boolean isGrid) { + this.isGrid = isGrid; + } public WeatherStationDataSource() { } diff --git a/src/main/resources/db/migration/V20__Add_Datasource_Property_IsGrid.sql b/src/main/resources/db/migration/V20__Add_Datasource_Property_IsGrid.sql new file mode 100644 index 00000000..468128cb --- /dev/null +++ b/src/main/resources/db/migration/V20__Add_Datasource_Property_IsGrid.sql @@ -0,0 +1,3 @@ +-- Adding this property when adding support for gridded weather datasources in VIPS +ALTER TABLE weather_station_data_source +ADD COLUMN is_grid BOOLEAN DEFAULT FALSE; \ No newline at end of file diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties index ea2b3d71..849d6e2f 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties @@ -1054,3 +1054,4 @@ thresholdDSVMax=DSV threshold for high infection risk thresholdDSVTempMin=Minimum temperature for DSV calculation useGridWeatherData=Use grid weather data doNotUse=Do not use +defaultGridWeatherStationDataSource=Gridded weather data source diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties index b632979d..3fb8bdfe 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_bs.properties @@ -1048,3 +1048,4 @@ thresholdDSVMax=DSV threshold for high infection risk thresholdDSVTempMin=Minimum temperature for DSV calculation useGridWeatherData=Use grid weather data doNotUse=Do not use +defaultGridWeatherStationDataSource=Gridded weather data source diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties index 286433a3..3f488790 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_hr.properties @@ -1046,3 +1046,4 @@ thresholdDSVMax=DSV threshold for high infection risk thresholdDSVTempMin=Minimum temperature for DSV calculation useGridWeatherData=Use grid weather data doNotUse=Do not use +defaultGridWeatherStationDataSource=Gridded weather data source diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties index 8629648d..0a3f9103 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_nb.properties @@ -1054,3 +1054,4 @@ thresholdDSVMax=DSV-terskel for h\u00f8y infeksjonsrisiko thresholdDSVTempMin=Minimumstemperatur for beregning av DSV useGridWeatherData=Bruk v\u00e6rdata fra rutenett doNotUse=Ikke bruk +defaultGridWeatherStationDataSource=GRID-basert v\u00e6rdatakilde diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties index 044f7b23..be4ee828 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_sr.properties @@ -1048,3 +1048,4 @@ thresholdDSVMax=DSV threshold for high infection risk thresholdDSVTempMin=Minimum temperature for DSV calculation useGridWeatherData=Use grid weather data doNotUse=Do not use +defaultGridWeatherStationDataSource=Gridded weather data source diff --git a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_zh_CN.properties b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_zh_CN.properties index 66a5fd1c..62560ca5 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_zh_CN.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts_zh_CN.properties @@ -1042,3 +1042,4 @@ thresholdDSVMax=DSV threshold for high infection risk thresholdDSVTempMin=Minimum temperature for DSV calculation useGridWeatherData=Use grid weather data doNotUse=Do not use +defaultGridWeatherStationDataSource=Gridded weather data source diff --git a/src/main/webapp/formdefinitions/organizationForm.json b/src/main/webapp/formdefinitions/organizationForm.json index acc63d9e..4ff9c999 100644 --- a/src/main/webapp/formdefinitions/organizationForm.json +++ b/src/main/webapp/formdefinitions/organizationForm.json @@ -95,6 +95,12 @@ "name" : "defaultMapCenter", "dataType" : "STRING", "required" : false + }, + { + "name": "defaultGridWeatherStationDataSourceId", + "dataType": "INTEGER", + "fieldType": "SELECT_SINGLE", + "required": false } ] diff --git a/src/main/webapp/templates/organizationForm.ftl b/src/main/webapp/templates/organizationForm.ftl index 50ac1afc..cb907e21 100644 --- a/src/main/webapp/templates/organizationForm.ftl +++ b/src/main/webapp/templates/organizationForm.ftl @@ -119,7 +119,7 @@ <input type="text" class="form-control" name="vipswebUrl" placeholder="${i18nBundle.vipswebUrl}" value="${(organization.vipswebUrl)!""}" onblur="validateField(this); "/> <span class="help-block" id="${formId}_vipswebUrl_validation"></span> </div> - <div class="form-group"> + <div class="form-group"> <label for="archiveUserId">${i18nBundle.archiveUserId}</label> <select class="form-control" name="archiveUserId" onblur="validateField(this);"> <option value="-1">${i18nBundle.pleaseSelect} ${i18nBundle.archiveUserId?lower_case} @@ -131,21 +131,33 @@ </select> <span class="help-block" id="${formId}_archiveUserId_validation"></span> </div> - <div class="form-group"> + <div class="form-group"> <label for="defaultVipsCoreUserId">${i18nBundle.defaultVipsCoreUserId}</label> <input type="number" class="form-control" name="defaultVipsCoreUserId" placeholder="${i18nBundle.defaultVipsCoreUserId}" value="${(organization.defaultVipsCoreUserId)!""}" onblur="validateField(this); "/> <span class="help-block" id="${formId}_defaultVipsCoreUserId_validation"></span> </div> - <div class="form-group"> + <div class="form-group"> <label for="defaultMapZoom">${i18nBundle.defaultMapZoom}</label> <input type="number" class="form-control" name="defaultMapZoom" placeholder="${i18nBundle.defaultMapZoom}" value="${(organization.defaultMapZoom)!""}" onblur="validateField(this); "/> <span class="help-block" id="${formId}_defaultMapZoom_validation"></span> </div> - <div class="form-group"> + <div class="form-group"> <label for="defaultMapCenter">${i18nBundle.defaultMapCenter} (WGS84 longitude,latitude)</label> <input type="text" class="form-control" name="defaultMapCenter" placeholder="${i18nBundle.defaultMapCenter}" value="${(defaultMapCenterLon?c)!""},${(defaultMapCenterLat?c)!""}" onblur="validateField(this); "/> <span class="help-block" id="${formId}_defaultMapCenter_validation"></span> </div> + <div class="form-group"> + <label for="defaultGridWeatherStationDataSourceId">${i18nBundle.defaultGridWeatherStationDataSource}</label> + <select class="form-control" name="defaultGridWeatherStationDataSourceId" onblur="validateField(this);"> + <option value="-1">${i18nBundle.pleaseSelect} ${i18nBundle.defaultGridWeatherStationDataSource?lower_case} + <#list gridWeatherDataSources as dSource> + <option value="${dSource.weatherStationDataSourceId}" + <#if organization.defaultGridWeatherStationDataSource?has_content && organization.defaultGridWeatherStationDataSource.weatherStationDataSourceId == dSource.weatherStationDataSourceId>selected="selected"</#if> + >${dSource.name}</option> + </#list> + </select> + <span class="help-block" id="${formId}_defaultGridWeatherStationDataSourceId_validation"></span> + </div> <button type="submit" class="btn btn-default">${i18nBundle.submit}</button> <#if organization.organizationId?has_content> <button type="button" class="btn btn-danger" onclick="if(confirm('${i18nBundle.confirmDelete}')){alert('Sorry, but this functionality has not yet been implemented');}">${i18nBundle.delete}</button> -- GitLab