diff --git a/pom.xml b/pom.xml index 70fcc0d0501360292fa2fbf293e6ef0dad799ea8..489080e123b0756f663bfba72070f1dc9f21fd32 100644 --- a/pom.xml +++ b/pom.xml @@ -124,7 +124,7 @@ <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> - <version>2.3.20</version> + <version>2.3.21</version> </dependency> <dependency> <groupId>it.sauronsoftware.cron4j</groupId> diff --git a/src/main/java/no/bioforsk/vips/logic/controller/servlet/ForecastConfigurationController.java b/src/main/java/no/bioforsk/vips/logic/controller/servlet/ForecastConfigurationController.java index 8749985bb2efd4d8f0f82236ff5a0da590405e2e..4421e6107a48ffc2d28583c45ccea02ee325179b 100644 --- a/src/main/java/no/bioforsk/vips/logic/controller/servlet/ForecastConfigurationController.java +++ b/src/main/java/no/bioforsk/vips/logic/controller/servlet/ForecastConfigurationController.java @@ -19,11 +19,16 @@ package no.bioforsk.vips.logic.controller.servlet; +import com.ibm.icu.util.Calendar; import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Date; import java.util.List; +import java.util.Locale; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; @@ -40,6 +45,7 @@ import no.bioforsk.vips.logic.entity.VipsLogicRole; import no.bioforsk.vips.logic.entity.VipsLogicUser; import no.bioforsk.vips.logic.i18n.SessionLocaleUtil; import no.bioforsk.vips.logic.util.SessionControllerGetter; +import no.bioforsk.vips.logic.util.SystemTime; import no.bioforsk.vips.util.ArrayUtil; import no.bioforsk.vips.util.ServletUtil; import no.bioforsk.web.forms.FormField; @@ -94,6 +100,22 @@ public class ForecastConfigurationController extends HttpServlet { selectedModelIds = new ArrayList(modelInformationMap.keySet()); } + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + Date from,to; + try + { + from = format.parse(request.getParameter("from")); + to = format.parse(request.getParameter("to")); + } + catch(NullPointerException | ParseException ex) + { + to = SystemTime.getSystemTime(); + Calendar cal = Calendar.getInstance(); + cal.setTime(to); + cal.add(Calendar.MONTH, -2); + from = cal.getTime(); + } + List<ForecastConfiguration> forecasts; if(user.isSuperUser()) @@ -114,19 +136,21 @@ public class ForecastConfigurationController extends HttpServlet { selectedOrganizationIds.add(o.getOrganizationId()); } } - forecasts = forecastBean.getForecastConfigurations(selectedOrganizationIds, selectedModelIds); + forecasts = forecastBean.getForecastConfigurations(selectedOrganizationIds, selectedModelIds, from, to); request.setAttribute("organizations", organizations); request.setAttribute("selectedOrganizationIds", selectedOrganizationIds); } else { - forecasts = forecastBean.getForecastConfigurations(user.getOrganizationId(), selectedModelIds); + forecasts = forecastBean.getForecastConfigurations(user.getOrganizationId(), selectedModelIds, from, to); } Collections.sort(forecasts); request.setAttribute("forecastConfigurations", forecasts); request.setAttribute("modelInformation", modelInformationMap); request.setAttribute("selectedModelIds", selectedModelIds); + request.setAttribute("from", from); + request.setAttribute("to", to); // If this is a redirect from a controller, with a message to be passed on request.setAttribute("messageKey", request.getParameter("messageKey")); request.getRequestDispatcher("/forecastConfigurationList.ftl").forward(request, response); diff --git a/src/main/java/no/bioforsk/vips/logic/controller/session/ForecastBean.java b/src/main/java/no/bioforsk/vips/logic/controller/session/ForecastBean.java index 81c518aba8ad0b63991202c0627afcedee68e470..511a3c29f13f0f41255e788fdf35cb293b9d055a 100644 --- a/src/main/java/no/bioforsk/vips/logic/controller/session/ForecastBean.java +++ b/src/main/java/no/bioforsk/vips/logic/controller/session/ForecastBean.java @@ -212,7 +212,7 @@ public class ForecastBean { .getResultList(); } - public List<ForecastConfiguration> getForecastConfigurations(Organization organization, List<String> modelIds) + public List<ForecastConfiguration> getForecastConfigurations(Organization organization, List<String> modelIds, Date from, Date to) { List<VipsLogicUser> organizationUsers = em .createNamedQuery("VipsLogicUser.findByOrganizationId") @@ -222,9 +222,11 @@ public class ForecastBean { if(!organizationUsers.isEmpty()) { return em - .createNamedQuery("ForecastConfiguration.findByVipsLogicUserIdsAndModelIds") + .createNamedQuery("ForecastConfiguration.findByVipsLogicUserIdsAndModelIdsAndDate") .setParameter("vipsLogicUserIds", organizationUsers) .setParameter("modelIds", modelIds) + .setParameter("from", from) + .setParameter("to", to) .getResultList(); } else @@ -233,7 +235,7 @@ public class ForecastBean { } } - public List<ForecastConfiguration> getForecastConfigurations(List<Integer> organizationIds, List<String> modelIds) + public List<ForecastConfiguration> getForecastConfigurations(List<Integer> organizationIds, List<String> modelIds, Date from, Date to) { List<VipsLogicUser> organizationUsers = em .createNamedQuery("VipsLogicUser.findByOrganizationIds") @@ -243,9 +245,11 @@ public class ForecastBean { if(!organizationUsers.isEmpty()) { return em - .createNamedQuery("ForecastConfiguration.findByVipsLogicUserIdsAndModelIds") + .createNamedQuery("ForecastConfiguration.findByVipsLogicUserIdsAndModelIdsAndDate") .setParameter("vipsLogicUserIds", organizationUsers) .setParameter("modelIds", modelIds) + .setParameter("from", from) + .setParameter("to", to) .getResultList(); } else diff --git a/src/main/java/no/bioforsk/vips/logic/entity/ForecastConfiguration.java b/src/main/java/no/bioforsk/vips/logic/entity/ForecastConfiguration.java index a0cae0a85a61cac45bef462a9ac2355112c62c72..8b0971edcd0b4ae694ff580d4402d2360095c713 100644 --- a/src/main/java/no/bioforsk/vips/logic/entity/ForecastConfiguration.java +++ b/src/main/java/no/bioforsk/vips/logic/entity/ForecastConfiguration.java @@ -63,7 +63,8 @@ import javax.persistence.Transient; @NamedQuery(name = "ForecastConfiguration.findByVipsLogicUserId", query = "SELECT f FROM ForecastConfiguration f WHERE f.vipsLogicUserId = :vipsLogicUserId"), @NamedQuery(name = "ForecastConfiguration.findByVipsLogicUserIdAndCropOrganismId", query = "SELECT f FROM ForecastConfiguration f WHERE f.vipsLogicUserId = :vipsLogicUserId AND f.cropOrganismId.organismId IN (:cropOrganismIds)"), @NamedQuery(name = "ForecastConfiguration.findByVipsLogicUserIds", query = "SELECT f FROM ForecastConfiguration f WHERE f.vipsLogicUserId IN (:vipsLogicUserIds)"), - @NamedQuery(name = "ForecastConfiguration.findByVipsLogicUserIdsAndModelIds", query = "SELECT f FROM ForecastConfiguration f WHERE f.vipsLogicUserId IN (:vipsLogicUserIds) AND f.modelId IN (:modelIds)") + @NamedQuery(name = "ForecastConfiguration.findByVipsLogicUserIdsAndModelIds", query = "SELECT f FROM ForecastConfiguration f WHERE f.vipsLogicUserId IN (:vipsLogicUserIds) AND f.modelId IN (:modelIds)"), + @NamedQuery(name = "ForecastConfiguration.findByVipsLogicUserIdsAndModelIdsAndDate", query = "SELECT f FROM ForecastConfiguration f WHERE f.vipsLogicUserId IN (:vipsLogicUserIds) AND f.modelId IN (:modelIds) AND f.dateStart <= :to AND f.dateEnd >= :from") }) public class ForecastConfiguration implements Serializable, Comparable { @OneToMany(cascade = CascadeType.ALL, mappedBy = "forecastConfiguration", fetch = FetchType.EAGER) diff --git a/src/main/java/no/bioforsk/vips/logic/scheduling/model/preprocessor/PlasmoparaViticolaModelPreprocessor.java b/src/main/java/no/bioforsk/vips/logic/scheduling/model/preprocessor/PlasmoparaViticolaModelPreprocessor.java index bf25691d06ccb7f6ccc6d7788c00a535bd9049a9..44b6710bf88c93ccc94aed21a27c49aa076498a2 100644 --- a/src/main/java/no/bioforsk/vips/logic/scheduling/model/preprocessor/PlasmoparaViticolaModelPreprocessor.java +++ b/src/main/java/no/bioforsk/vips/logic/scheduling/model/preprocessor/PlasmoparaViticolaModelPreprocessor.java @@ -54,16 +54,7 @@ public class PlasmoparaViticolaModelPreprocessor extends ModelRunPreprocessor{ cal.set(Calendar.DATE, 1); Date startDate = wUtil.normalizeToExactDate(cal.getTime(), timeZone); - /*List<WeatherObservation> observations = getWeatherObservations( - weatherStation.getDataFetchUri(), - WeatherObservation.LOG_INTERVAL_ID_1H, - new String[]{ - WeatherElements.TEMPERATURE_MEAN, - WeatherElements.PRECIPITATION - }, - startDate, - endDate, - timeZone);*/ + ModelConfiguration retVal = new ModelConfiguration(); List<WeatherObservation> observations = getWeatherObservations( weatherStation, WeatherObservation.LOG_INTERVAL_ID_1H, @@ -73,8 +64,8 @@ public class PlasmoparaViticolaModelPreprocessor extends ModelRunPreprocessor{ }, startDate, endDate); + // TODO: weather data validation - ModelConfiguration retVal = new ModelConfiguration(); retVal.setModelId(this.getModelId()); retVal.setConfigParameter("timeZone", timeZone.getID()); retVal.setConfigParameter("observations", observations); diff --git a/src/main/webapp/templates/forecastConfigurationList.ftl b/src/main/webapp/templates/forecastConfigurationList.ftl index 50a48b08f3ac11c9d2ff0e727c9df53ef1fa94c7..6feb2b1798a4d5225b0085aef5331f800742a0c3 100644 --- a/src/main/webapp/templates/forecastConfigurationList.ftl +++ b/src/main/webapp/templates/forecastConfigurationList.ftl @@ -28,13 +28,13 @@ <form class="form-inline" role="form" action="/forecastConfiguration" method="GET"> <div class="form-group"> <label class="sr-only" for="modelId">Model</label> - <select name="modelId" multiple="multiple" size="3"> + <select name="modelId" multiple="multiple" size="3" class="form-control"> <#list modelInformation?values?sort_by("defaultName") as modelInformationItem> <option value="${modelInformationItem.modelId}" ${selectedModelIds?seq_contains(modelInformationItem.modelId)?string(" selected=\"selected\"","")}> <#if i18nBundle.containsKey(modelInformationItem.modelId)> - ${i18nBundle[modelInformationItem.modelId]} + ${i18nBundle[modelInformationItem.modelId][0..*25]} <#else> - ${modelInformation[modelInformationItem.modelId].defaultName} + ${modelInformation[modelInformationItem.modelId].defaultName[0..*25]} </#if> </option> </#list> @@ -43,7 +43,7 @@ <#if user.isSuperUser() > <div class="form-group"> <label class="sr-only" for="organizationId">Organization</label> - <select name="organizationId" size="3" multiple="multiple"> + <select name="organizationId" size="3" multiple="multiple" class="form-control"> <#list organizations?sort_by("organizationName") as organization> <option value="${organization.organizationId}" ${selectedOrganizationIds?seq_contains(organization.organizationId)?string(" selected=\"selected\"","")}> ${organization.organizationName} @@ -52,6 +52,14 @@ </select> </div> </#if> + <div class="form-group"> + <input type="date" class="form-control" name="from" placeholder="${i18nBundle.from}" value="${(from?date)!""}"/> + </div> + - + <div class="form-group"> + <input type="date" class="form-control" name="to" placeholder="${i18nBundle.to}" value="${(to?date)!""}"/> + </div> + <button type="submit" class="btn btn-default">Filter</button> </form> </div>