diff --git a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaHumidityModelPreprocessor.java b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaHumidityModelPreprocessor.java new file mode 100644 index 0000000000000000000000000000000000000000..7a0c1d6ef4b9a2dd3781320d44190abbb463b65c --- /dev/null +++ b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/SeptoriaHumidityModelPreprocessor.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2019 NIBIO <http://www.nibio.no/>. + * + * This file is part of VIPSLogic. + * VIPSLogic is free software: you can redistribute it and/or modify + * it under the terms of the NIBIO Open Source License as published by + * NIBIO, either version 1 of the License, or (at your option) any + * later version. + * + * VIPSLogic is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * NIBIO Open Source License for more details. + * + * You should have received a copy of the NIBIO Open Source License + * along with VIPSLogic. If not, see <http://www.nibio.no/licenses/>. + * + */ + +package no.nibio.vips.logic.scheduling.model.preprocessor; + +import java.util.Collections; +import java.util.List; +import no.nibio.vips.entity.ModelConfiguration; +import no.nibio.vips.entity.WeatherObservation; +import no.nibio.vips.logic.entity.ForecastConfiguration; +import no.nibio.vips.logic.entity.PointOfInterestWeatherStation; +import no.nibio.vips.logic.scheduling.model.ModelRunPreprocessor; +import no.nibio.vips.logic.scheduling.model.PreprocessorException; +import no.nibio.vips.util.WeatherElements; +import no.nibio.vips.util.weather.WeatherDataSourceException; +import no.nibio.vips.util.weather.WeatherDataSourceUtil; + +/** + * @copyright 2019 <a href="http://www.nibio.no/">NIBIO</a> + * @author Tor-Einar Skog <tor-einar.skog@nibio.no> + */ +public class SeptoriaHumidityModelPreprocessor extends ModelRunPreprocessor{ + + @Override + public ModelConfiguration getModelConfiguration(ForecastConfiguration configuration) throws PreprocessorException + { + ModelConfiguration retVal = new ModelConfiguration(); + retVal.setModelId(this.getModelId()); + retVal.setConfigParameter("timeZone", configuration.getTimeZone()); + WeatherDataSourceUtil wdsUtil = new WeatherDataSourceUtil(); + try + { + List<WeatherObservation> observations = wdsUtil.getWeatherObservations( + (PointOfInterestWeatherStation) configuration.getWeatherStationPointOfInterestId(), + WeatherObservation.LOG_INTERVAL_ID_1H, + new String[]{ + WeatherElements.TEMPERATURE_MEAN, + WeatherElements.PRECIPITATION, + WeatherElements.RELATIVE_HUMIDITY_MEAN, + WeatherElements.LEAF_WETNESS_DURATION + }, + configuration.getDateStart(), + configuration.getDateEnd() + ); + Collections.sort(observations); + retVal.setConfigParameter("observations", observations); + } + catch(WeatherDataSourceException ex) + { + throw new PreprocessorException(ex.getMessage()); + } + configuration.getForecastModelConfigurationSet().forEach(c-> + retVal.setConfigParameter(c.getForecastModelConfigurationPK().getModelConfigParameter(), c.getParameterValue()) + ); + return retVal; + } + + + + @Override + public String getModelId() { + return "SEPTORIAHU"; + } + +} diff --git a/src/main/java/no/nibio/vips/logic/service/ModelFormService.java b/src/main/java/no/nibio/vips/logic/service/ModelFormService.java index 56ddefe8bf63694c9ccd4d100705040de9b76463..30f5099d740d8fa0cb870d40c77dbf0717cb9694 100644 --- a/src/main/java/no/nibio/vips/logic/service/ModelFormService.java +++ b/src/main/java/no/nibio/vips/logic/service/ModelFormService.java @@ -22,8 +22,12 @@ package no.nibio.vips.logic.service; import com.vividsolutions.jts.geom.Coordinate; import com.webcohesion.enunciate.metadata.Facet; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.TimeZone; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -33,9 +37,15 @@ import no.nibio.vips.entity.ModelConfiguration; import no.nibio.vips.entity.Result; import no.nibio.vips.entity.WeatherObservation; import no.nibio.vips.gis.GISUtil; +import no.nibio.vips.logic.entity.ForecastConfiguration; +import no.nibio.vips.logic.entity.ForecastModelConfiguration; +import no.nibio.vips.logic.entity.ForecastModelConfigurationPK; import no.nibio.vips.logic.entity.Organization; import no.nibio.vips.logic.entity.PointOfInterestWeatherStation; import no.nibio.vips.logic.entity.WeatherStationDataSource; +import no.nibio.vips.logic.scheduling.model.PreprocessorException; +import no.nibio.vips.logic.scheduling.model.preprocessor.SeptoriaApiicolaModelPreprocessor; +import no.nibio.vips.logic.scheduling.model.preprocessor.SeptoriaHumidityModelPreprocessor; import no.nibio.vips.logic.util.RunModelException; import no.nibio.vips.logic.util.SessionControllerGetter; import no.nibio.vips.logic.util.SystemTime; @@ -79,29 +89,50 @@ public class ModelFormService { ){ try { - ModelConfiguration mConf = new ModelConfiguration(); - mConf.setModelId("SEPTORIAHU"); - mConf.setConfigParameter("dateSpraying1", dateSpraying1); - mConf.setConfigParameter("dateSpraying2", dateSpraying2); - mConf.setConfigParameter("dateGs31", dateGs31); - mConf.setConfigParameter("date3rdUpperLeafEmerging", date3rdUpperLeafEmerging); - mConf.setConfigParameter("date2ndUpperLeafEmerging", date2ndUpperLeafEmerging); - mConf.setConfigParameter("dateUpperLeafEmerging", dateUpperLeafEmerging); - mConf.setConfigParameter("dateGs75", dateGs75); - mConf.setConfigParameter("thresholdRelativeHumidity", thresholdRelativeHumidity); - mConf.setConfigParameter("thresholdLeafWetness", thresholdLeafWetness); - mConf.setConfigParameter("thresholdPrecipitation", thresholdPrecipitation); - mConf.setConfigParameter("slidingHoursPast", slidingHoursPast); - mConf.setConfigParameter("slidingHoursAhead", slidingHoursAhead); - mConf.setConfigParameter("thresholdHumidPeriodHours", thresholdHumidPeriodHours); - mConf.setConfigParameter("sprayingProtectionDays", sprayingProtectionDays); - mConf.setConfigParameter("leafLifeTime", leafLifeTime); + ForecastConfiguration fConf = new ForecastConfiguration(); + fConf.setModelId("SEPTORIAHU"); + + Set<ForecastModelConfiguration> fModelConf = new HashSet<>(); + fModelConf.add(this.getForecastModelConfiguration("dateSpraying1", dateSpraying1)); + fModelConf.add(this.getForecastModelConfiguration("dateSpraying2", dateSpraying2)); + fModelConf.add(this.getForecastModelConfiguration("dateGs31", dateGs31)); + fModelConf.add(this.getForecastModelConfiguration("date3rdUpperLeafEmerging", date3rdUpperLeafEmerging)); + fModelConf.add(this.getForecastModelConfiguration("date2ndUpperLeafEmerging", date2ndUpperLeafEmerging)); + fModelConf.add(this.getForecastModelConfiguration("dateUpperLeafEmerging", dateUpperLeafEmerging)); + fModelConf.add(this.getForecastModelConfiguration("dateGs75", dateGs75)); + fModelConf.add(this.getForecastModelConfiguration("thresholdRelativeHumidity", String.valueOf(thresholdRelativeHumidity))); + fModelConf.add(this.getForecastModelConfiguration("thresholdLeafWetness", String.valueOf(thresholdLeafWetness))); + fModelConf.add(this.getForecastModelConfiguration("thresholdPrecipitation", String.valueOf(thresholdPrecipitation))); + fModelConf.add(this.getForecastModelConfiguration("slidingHoursPast", String.valueOf(slidingHoursPast))); + fModelConf.add(this.getForecastModelConfiguration("slidingHoursAhead", String.valueOf(slidingHoursAhead))); + fModelConf.add(this.getForecastModelConfiguration("thresholdHumidPeriodHours", String.valueOf(thresholdHumidPeriodHours))); + fModelConf.add(this.getForecastModelConfiguration("sprayingProtectionDays", String.valueOf(sprayingProtectionDays))); + fModelConf.add(this.getForecastModelConfiguration("leafLifeTime", String.valueOf(leafLifeTime))); + fConf.setForecastModelConfigurationSet(fModelConf); + + //ModelConfiguration mConf = new ModelConfiguration(); + //mConf.setModelId("SEPTORIAHU"); + //mConf.setConfigParameter("dateSpraying1", dateSpraying1); + //mConf.setConfigParameter("dateSpraying2", dateSpraying2); + //mConf.setConfigParameter("dateGs31", dateGs31); + //mConf.setConfigParameter("date3rdUpperLeafEmerging", date3rdUpperLeafEmerging); + //mConf.setConfigParameter("date2ndUpperLeafEmerging", date2ndUpperLeafEmerging); + //mConf.setConfigParameter("dateUpperLeafEmerging", dateUpperLeafEmerging); + //mConf.setConfigParameter("dateGs75", dateGs75); + //mConf.setConfigParameter("thresholdRelativeHumidity", thresholdRelativeHumidity); + //mConf.setConfigParameter("thresholdLeafWetness", thresholdLeafWetness); + //mConf.setConfigParameter("thresholdPrecipitation", thresholdPrecipitation); + //mConf.setConfigParameter("slidingHoursPast", slidingHoursPast); + //mConf.setConfigParameter("slidingHoursAhead", slidingHoursAhead); + //mConf.setConfigParameter("thresholdHumidPeriodHours", thresholdHumidPeriodHours); + //mConf.setConfigParameter("sprayingProtectionDays", sprayingProtectionDays); + //mConf.setConfigParameter("leafLifeTime", leafLifeTime); // Data parsing Integer organizationId = Integer.valueOf(organizationId_countryCode.split("_")[0]); Organization organization = SessionControllerGetter.getUserBean().getOrganization(organizationId); - mConf.setConfigParameter("timeZone", organization.getDefaultTimeZone()); + fConf.setTimeZone(organization.getDefaultTimeZone()); TimeZone timeZone = TimeZone.getTimeZone(organization.getDefaultTimeZone()); ParseRESTParamUtil pUtil = new ParseRESTParamUtil(); // Start time is gs31, easy @@ -116,6 +147,9 @@ public class ModelFormService { dayAfterTomorrow = new XDate(wUtil.pragmaticAdjustmentToMidnight(dayAfterTomorrow, timeZone)); // The first check here is to see if the systemtime is too early Date endTime = dayAfterTomorrow.after(gs75) ? gs75 : dayAfterTomorrow; + + fConf.setDateStart(startTime); + fConf.setDateEnd(endTime); String countryCode = organizationId_countryCode.split("_")[1]; List<WeatherObservation> observations; @@ -143,19 +177,10 @@ public class ModelFormService { // Weather station id maps to a regular weather station ws = (PointOfInterestWeatherStation) SessionControllerGetter.getPointOfInterestBean().getPointOfInterest(Integer.valueOf(weatherStationId)); } - observations = wdsUtil.getWeatherObservations( - ws, - WeatherObservation.LOG_INTERVAL_ID_1H, - new String[]{ - WeatherElements.TEMPERATURE_MEAN, - WeatherElements.PRECIPITATION, - WeatherElements.RELATIVE_HUMIDITY_MEAN, - WeatherElements.LEAF_WETNESS_DURATION - }, - startTime, - endTime - ); - mConf.setConfigParameter("observations",observations); + fConf.setWeatherStationPointOfInterestId(ws); + fConf.setLocationPointOfInterestId(ws); + + ModelConfiguration mConf = new SeptoriaHumidityModelPreprocessor().getModelConfiguration(fConf); Integer VIPSCoreUserId = organization.getDefaultVipsCoreUserId(); @@ -163,9 +188,16 @@ public class ModelFormService { return Response.ok().entity(results).build(); } - catch(WeatherDataSourceException | RunModelException ex) + catch(PreprocessorException |RunModelException ex) { return Response.serverError().entity(ex.getMessage()).build(); - } + } + } + + private ForecastModelConfiguration getForecastModelConfiguration(String key, String value) + { + ForecastModelConfiguration retVal = new ForecastModelConfiguration(new ForecastModelConfigurationPK(-1, key)); + retVal.setParameterValue(value); + return retVal; } }