diff --git a/pom.xml b/pom.xml index f5d987b2779347151b2b7a51ea8794b45516d05d..5ca5dedc2ffbf5473d6e8863e458696bf1ea197b 100755 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <geotools.version>13.4</geotools.version> + <geotools.version>20.2</geotools.version> </properties> <name>VIPSLogic</name> <url>http://maven.apache.org</url> @@ -19,6 +19,10 @@ <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> + <repository> + <id>mvnrepository.com</id> + <url>https://mvnrepository.com</url> + </repository> <repository> <id>bedatadriven</id> <name>bedatadriven public repo</name> @@ -49,15 +53,15 @@ <version>4.2.0</version> </dependency> <dependency> - <groupId>com.github.bjornharrtell</groupId> - <!--groupId>org.wololo</groupId--> + <!--groupId>com.github.bjornharrtell</groupId--> + <groupId>org.wololo</groupId> <artifactId>jts2geojson</artifactId> - <version>0.10.0</version> + <version>0.12.0</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-spatial</artifactId> - <version>5.3.9.Final</version> + <version>5.4.2.Final</version> <exclusions> <exclusion> <artifactId>postgresql</artifactId> @@ -168,8 +172,7 @@ <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> - <version>5.3.9.Final</version> - <scope>provided</scope> + <version>5.4.2.Final</version> </dependency> <dependency> <groupId>org.postgresql</groupId> @@ -183,6 +186,12 @@ <version>2.9.8</version> <type>jar</type> </dependency> + <dependency> + <groupId>org.locationtech.jts</groupId> + <artifactId>jts-core</artifactId> + <version>1.16.1</version> + <type>jar</type> + </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> @@ -251,12 +260,12 @@ <dependency> <groupId>org.geotools</groupId> <artifactId>gt-api</artifactId> - <version>17.2</version> + <version>20.3</version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-epsg-hsql</artifactId> - <version>17.2</version> + <version>20.3</version> </dependency> <dependency> <groupId>com.webcohesion.enunciate</groupId> @@ -272,7 +281,7 @@ <dependency> <groupId>com.bedatadriven</groupId> <artifactId>jackson-datatype-jts</artifactId> - <version>2.2</version> + <version>2.4</version> </dependency> </dependencies> 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 67a068d77657ddf6b1b562ea9056eda6f962e60c..68f30fcbefa199f806de82884ecc2dadf561afaa 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 @@ -20,11 +20,8 @@ package no.nibio.vips.logic.controller.servlet; import java.io.IOException; -import java.io.PrintWriter; -import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.Locale; import java.util.TimeZone; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; 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 20676a24358b948d44aa14ceb81f4b6061ee98c6..b3fb1d1b33bc6cf3ebc6aa3f24bea3864bd87197 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 @@ -19,9 +19,9 @@ package no.nibio.vips.logic.controller.servlet; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.geom.Point; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; import java.io.IOException; import java.net.URISyntaxException; import java.util.Collections; diff --git a/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java b/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java index 0b16c62705c583f6ec075420a32f8ee154fa3fb6..b6553a330107a34e6044e20f79c61881e5aa0b4d 100755 --- a/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java +++ b/src/main/java/no/nibio/vips/logic/controller/session/ForecastBean.java @@ -20,7 +20,6 @@ package no.nibio.vips.logic.controller.session; import com.fasterxml.jackson.databind.JsonNode; -import com.google.common.base.Functions; import java.util.Calendar; import java.util.TimeZone; import de.micromata.opengis.kml.v_2_2_0.Coordinate; @@ -51,7 +50,6 @@ import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.PersistenceContext; import javax.persistence.Query; -import javax.ws.rs.ProcessingException; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.WebTarget; @@ -599,7 +597,7 @@ public class ForecastBean { { ex.printStackTrace(); }*/ - Response resp = this.getManagerResource().runModel(config.getModelId(), request); + Response resp = this.getManagerResource().runModel(config.getModelId(), request); if(resp.getStatus() == Response.Status.OK.getStatusCode()) { //System.out.println(resp.readEntity(String.class)); diff --git a/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java b/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java index 4d4d1f2a269835f7a293dc96ccdb1478861ba883..d886aa58f9cddabeb469808aa503ddd3ccbf970a 100755 --- a/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java +++ b/src/main/java/no/nibio/vips/logic/entity/ForecastResult.java @@ -45,7 +45,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.vividsolutions.jts.geom.Geometry; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import no.nibio.vips.logic.entity.helpers.ForecastResultSerializer; +import org.locationtech.jts.geom.Geometry; /** @@ -62,6 +64,7 @@ import com.vividsolutions.jts.geom.Geometry; @NamedQuery(name = "ForecastResult.findByForecastConfigurationIdAndPeriod", query = "SELECT f FROM ForecastResult f WHERE f.forecastConfigurationId = :forecastConfigurationId AND f.validTimeStart BETWEEN :timeStart AND :timeEnd ORDER BY f.validTimeStart ASC"), @NamedQuery(name = "ForecastResult.findByValidTimeStart", query = "SELECT f FROM ForecastResult f WHERE f.validTimeStart = :validTimeStart ORDER BY f.validTimeStart ASC"), @NamedQuery(name = "ForecastResult.findByWarningStatus", query = "SELECT f FROM ForecastResult f WHERE f.warningStatus = :warningStatus ORDER BY f.validTimeStart ASC")}) +@JsonSerialize(using=ForecastResultSerializer.class) public class ForecastResult implements Serializable, Comparable{ private static final long serialVersionUID = 1L; @Id diff --git a/src/main/java/no/nibio/vips/logic/entity/Gis.java b/src/main/java/no/nibio/vips/logic/entity/Gis.java index b0fef7e6ef89b658adfa0b15517f91bc5f1e4e14..7ee47bb64d87b1f1184284d87a8c1846d6a6dba5 100755 --- a/src/main/java/no/nibio/vips/logic/entity/Gis.java +++ b/src/main/java/no/nibio/vips/logic/entity/Gis.java @@ -20,8 +20,8 @@ package no.nibio.vips.logic.entity; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.Geometry; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Geometry; import java.io.Serializable; import javax.persistence.Basic; import javax.persistence.Column; diff --git a/src/main/java/no/nibio/vips/logic/entity/Organization.java b/src/main/java/no/nibio/vips/logic/entity/Organization.java index a02f5f55c5ddd011e90ca43606cb85550ea7657e..aaa394b877711f52016cdf6224a690c352989fb0 100755 --- a/src/main/java/no/nibio/vips/logic/entity/Organization.java +++ b/src/main/java/no/nibio/vips/logic/entity/Organization.java @@ -19,7 +19,7 @@ package no.nibio.vips.logic.entity; -import com.vividsolutions.jts.geom.Point; +import org.locationtech.jts.geom.Point; import java.io.Serializable; import java.util.Set; import javax.persistence.Basic; @@ -40,6 +40,7 @@ import javax.xml.bind.annotation.XmlTransient; import com.fasterxml.jackson.annotation.JsonIgnore; import javax.persistence.FetchType; import javax.persistence.OneToOne; +import org.hibernate.annotations.Type; /** * @copyright 2019 <a href="http://www.nibio.no/">NIBIO</a> diff --git a/src/main/java/no/nibio/vips/logic/entity/PointOfInterest.java b/src/main/java/no/nibio/vips/logic/entity/PointOfInterest.java index d047e6dafa7fdb065c2f53ef706da9c5f16f54f3..f8325ed7b538bac528c7bb2ba202491292fc47f7 100755 --- a/src/main/java/no/nibio/vips/logic/entity/PointOfInterest.java +++ b/src/main/java/no/nibio/vips/logic/entity/PointOfInterest.java @@ -39,7 +39,7 @@ import javax.persistence.Transient; import javax.validation.constraints.Size; import javax.xml.bind.annotation.XmlRootElement; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.vividsolutions.jts.geom.Geometry; +import org.locationtech.jts.geom.Geometry; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.DiscriminatorType; diff --git a/src/main/java/no/nibio/vips/logic/entity/helpers/ForecastResultSerializer.java b/src/main/java/no/nibio/vips/logic/entity/helpers/ForecastResultSerializer.java new file mode 100644 index 0000000000000000000000000000000000000000..4b7b7655622b93f178eea630bf370e57ea14d883 --- /dev/null +++ b/src/main/java/no/nibio/vips/logic/entity/helpers/ForecastResultSerializer.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2018 NIBIO <http://www.nibio.no/>. + * + * This file is part of VIPSCommon. + * VIPSCommon 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. + * + * VIPSCommon 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 VIPSCommon. If not, see <http://www.nibio.no/licenses/>. + * + */ + +package no.nibio.vips.logic.entity.helpers; + +import com.bedatadriven.jackson.datatype.jts.JtsModule; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.LineString; +import org.locationtech.jts.geom.Point; +import org.locationtech.jts.geom.Polygon; +import java.io.IOException; +import no.nibio.vips.gis.GISUtil; +import no.nibio.vips.logic.entity.ForecastResult; + +/** + * Unfortunately, we have to do this, since Resteasy does not currently support the org.locationtech.jts package + * Ref http://www.baeldung.com/jackson-custom-serialization + * @copyright 2019 <a href="http://www.nibio.no/">NIBIO</a> + * @author Tor-Einar Skog <tor-einar.skog@nibio.no> + */ +public class ForecastResultSerializer extends StdSerializer<ForecastResult>{ + ObjectMapper objectMapper; + GeometryFactory gf; + GISUtil gisUtil; + public ForecastResultSerializer() { + this(null); + this.gisUtil = new GISUtil(); + } + + public ForecastResultSerializer(Class<ForecastResult> t) { + super(t); + this.objectMapper = new ObjectMapper(); + this.objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + this.objectMapper.registerModule(new JtsModule()); + } + + @Override + public void serialize(ForecastResult t, JsonGenerator jg, SerializerProvider sp) throws IOException { + jg.writeStartObject(); + jg.writeStringField("validTimeStart", this.objectMapper.writeValueAsString(t.getValidTimeStart()).replaceAll("\"", "")); + jg.writeStringField("validTimeEnd", this.objectMapper.writeValueAsString(t.getValidTimeEnd()).replaceAll("\"", "")); + String geoJSON = t.getValidGeometry() == null ? "null" + : t.getValidGeometry().getGeometryType().equals("Point") ? objectMapper.writeValueAsString(this.gisUtil.getVividPoint((Point) t.getValidGeometry())) + : t.getValidGeometry().getGeometryType().equals("LineString") ? objectMapper.writeValueAsString((LineString) t.getValidGeometry()) + :t.getValidGeometry().getGeometryType().equals("Polygon") ? objectMapper.writeValueAsString((Polygon) t.getValidGeometry()) + : "null"; + + //jg.writeObjectField("validGeometry", t.getValidGeometry()); + //System.out.println(geoJSON); + jg.writeRaw(",\"validGeometry\":" + geoJSON); + // + jg.writeNumberField("warningStatus", t.getWarningStatus()); + jg.writeNumberField("forecastResultId", t.getForecastResultId()); + jg.writeNumberField("forecastConfigurationId", t.getForecastConfigurationId()); + //System.out.println(t.getAllValues()); + jg.writeRaw(",\"allValues\": " + t.getAllValues()); + jg.writeRaw(",\"keys\": [" + "\"" + String.join("\",\"", t.getKeys()) + "\"]"); + jg.writeEndObject(); + } + + + +} diff --git a/src/main/java/no/nibio/vips/logic/gis/GeometryEntity.java b/src/main/java/no/nibio/vips/logic/gis/GeometryEntity.java index 81fc2d344275a100080660c09915f3539d203e37..6589880e44b7d844b7c754589c8c47ddd2479756 100755 --- a/src/main/java/no/nibio/vips/logic/gis/GeometryEntity.java +++ b/src/main/java/no/nibio/vips/logic/gis/GeometryEntity.java @@ -19,7 +19,7 @@ package no.nibio.vips.logic.gis; -import com.vividsolutions.jts.geom.Geometry; +import org.locationtech.jts.geom.Geometry; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSite.java b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSite.java index bf96fa03642907de80bd4e7c0b8caef084f8b059..3e425dcd7dd80a0846758d94cdec9e4e244f7b94 100755 --- a/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSite.java +++ b/src/main/java/no/nibio/vips/logic/modules/applefruitmoth/ObservationSite.java @@ -19,7 +19,7 @@ package no.nibio.vips.logic.modules.applefruitmoth; -import com.vividsolutions.jts.geom.Geometry; +import org.locationtech.jts.geom.Geometry; import java.io.Serializable; import java.util.Date; import java.util.HashSet; diff --git a/src/main/java/no/nibio/vips/logic/scheduling/model/grid/preprocessor/ZymoseptoriaSimpleRiskGridModelPreprocessor.java b/src/main/java/no/nibio/vips/logic/scheduling/model/grid/preprocessor/ZymoseptoriaSimpleRiskGridModelPreprocessor.java index e22771e2ca96419ce0a7e9a87ec61d9d623a92b0..56c591f0307468b50ef91b2840ba2de2caf7cd66 100644 --- a/src/main/java/no/nibio/vips/logic/scheduling/model/grid/preprocessor/ZymoseptoriaSimpleRiskGridModelPreprocessor.java +++ b/src/main/java/no/nibio/vips/logic/scheduling/model/grid/preprocessor/ZymoseptoriaSimpleRiskGridModelPreprocessor.java @@ -19,7 +19,7 @@ package no.nibio.vips.logic.scheduling.model.grid.preprocessor; -import com.vividsolutions.jts.geom.Coordinate; +import org.locationtech.jts.geom.Coordinate; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; @@ -34,6 +34,7 @@ import java.util.stream.Stream; import no.nibio.vips.entity.ModelConfiguration; import no.nibio.vips.entity.PointWeatherObservationList; import no.nibio.vips.entity.WeatherObservation; +import no.nibio.vips.gis.CoordinateProxy; import no.nibio.vips.logic.entity.ForecastConfiguration; import no.nibio.vips.logic.entity.PointOfInterestWeatherStation; import no.nibio.vips.logic.scheduling.model.ModelRunPreprocessor; @@ -66,7 +67,7 @@ public class ZymoseptoriaSimpleRiskGridModelPreprocessor extends ModelRunPreproc WeatherUtil wUtil = new WeatherUtil(); for(PointOfInterestWeatherStation station:stations) { - Coordinate coordinate = new Coordinate(station.getPointOfInterest().getLongitude(), station.getPointOfInterest().getLatitude()); + CoordinateProxy coordinate = new CoordinateProxy(station.getPointOfInterest().getLongitude(), station.getPointOfInterest().getLatitude()); List<WeatherObservation> stationObs = getStationObs(station, configuration); try diff --git a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/FinnCerealModelsPreprocessor.java b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/FinnCerealModelsPreprocessor.java index bf23442b55740007263e265027e4bdf988ae8c8d..232c0cd2942766ce44489147d6a461123b435aec 100644 --- a/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/FinnCerealModelsPreprocessor.java +++ b/src/main/java/no/nibio/vips/logic/scheduling/model/preprocessor/FinnCerealModelsPreprocessor.java @@ -2,6 +2,7 @@ package no.nibio.vips.logic.scheduling.model.preprocessor; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Collections; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -54,6 +55,7 @@ public class FinnCerealModelsPreprocessor extends ModelRunPreprocessor { }, sowingDate, configuration.getDateEndInTimeZone()); + Collections.sort(observations); observations = wUtil.checkForAndFixHourlyTimeSeriesHoles(observations); List<WeatherObservation> temperature = observations.stream().filter(t -> t.getElementMeasurementTypeId().equals(WeatherElements.TEMPERATURE_MEAN)) .collect(Collectors.toList()); @@ -63,11 +65,30 @@ public class FinnCerealModelsPreprocessor extends ModelRunPreprocessor { .collect(Collectors.toList()); List<WeatherObservation> windSpeedAll = observations.stream().filter(t -> t.getElementMeasurementTypeId().equals(WeatherElements.WIND_SPEED_2M)) .collect(Collectors.toList()); - if(windSpeedAll.isEmpty()) { - windSpeedAll = observations.stream().filter(t -> t.getElementMeasurementTypeId().equals(WeatherElements.WIND_SPEED_10MIN_2M)) - .collect(Collectors.toList()); + + // Dealing with wind, which may be dodgy with regards to forecasts etc. + if(windSpeedAll.isEmpty() || windSpeedAll.size() != temperature.size()) { + List<WeatherObservation> windFallback = observations.stream() + .filter(t -> t.getElementMeasurementTypeId().equals(WeatherElements.WIND_SPEED_10MIN_2M)) + .collect(Collectors.toList()); + if(windSpeedAll.isEmpty()) + { + windSpeedAll.addAll(windFallback); + } + else + { + Collections.sort(windSpeedAll); + Date lastWindTime = windSpeedAll.get(windSpeedAll.size()-1).getTimeMeasured(); + windSpeedAll.addAll(windFallback.stream().filter(o->o.getTimeMeasured().after(lastWindTime)).collect(Collectors.toList())); + } } - /*System.out.println("Observations size = " + observations.size()); + + + /* + Collections.sort(temperature); + System.out.println("First temp is at " + temperature.get(0).getTimeMeasured()); + System.out.println("Last temp is at " + temperature.get(temperature.size()-1).getTimeMeasured()); + System.out.println("Observations size = " + observations.size()); System.out.println("temperature size=" + temperature.size()); System.out.println("rainfall size=" + rainfall.size()); System.out.println("rh size =" + rh.size()); 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..04b997c65113b79fbf652011cef02f47f73f90a0 100644 --- a/src/main/java/no/nibio/vips/logic/service/ModelFormService.java +++ b/src/main/java/no/nibio/vips/logic/service/ModelFormService.java @@ -19,10 +19,12 @@ package no.nibio.vips.logic.service; -import com.vividsolutions.jts.geom.Coordinate; +import org.locationtech.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 javax.ws.rs.GET; import javax.ws.rs.Path; @@ -33,17 +35,20 @@ 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.SeptoriaHumidityModelPreprocessor; import no.nibio.vips.logic.util.RunModelException; import no.nibio.vips.logic.util.SessionControllerGetter; import no.nibio.vips.logic.util.SystemTime; import no.nibio.vips.util.ParseRESTParamUtil; -import no.nibio.vips.util.WeatherElements; import no.nibio.vips.util.WeatherUtil; import no.nibio.vips.util.XDate; -import no.nibio.vips.util.weather.WeatherDataSourceException; import no.nibio.vips.util.weather.WeatherDataSourceUtil; /** @@ -79,29 +84,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 +142,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,29 +172,28 @@ 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(); + System.out.println("defaultVIPScoreUserId = " + VIPSCoreUserId); List<Result>results = SessionControllerGetter.getForecastBean().runForecast(mConf, VIPSCoreUserId); 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; } } diff --git a/src/main/java/no/nibio/vips/logic/util/GISEntityUtil.java b/src/main/java/no/nibio/vips/logic/util/GISEntityUtil.java index 0000b69afdff9fb6ed58ff5f324e9329dd604f43..6b9160c76ffb3e4230a69889ebe84473d3b7d142 100755 --- a/src/main/java/no/nibio/vips/logic/util/GISEntityUtil.java +++ b/src/main/java/no/nibio/vips/logic/util/GISEntityUtil.java @@ -146,7 +146,7 @@ public class GISEntityUtil { - public de.micromata.opengis.kml.v_2_2_0.Coordinate getKMLCoordinateFromJTSCoordinate(com.vividsolutions.jts.geom.Coordinate jtsCoordinate) + public de.micromata.opengis.kml.v_2_2_0.Coordinate getKMLCoordinateFromJTSCoordinate(org.locationtech.jts.geom.Coordinate jtsCoordinate) { return new de.micromata.opengis.kml.v_2_2_0.Coordinate( jtsCoordinate.x, diff --git a/src/main/java/no/nibio/web/forms/FormField.java b/src/main/java/no/nibio/web/forms/FormField.java index 65e23918e16b8888104ca29dfe69439ca0273245..b99a15e2e90f75591b54a3bad0f4e7b101c1d043 100755 --- a/src/main/java/no/nibio/web/forms/FormField.java +++ b/src/main/java/no/nibio/web/forms/FormField.java @@ -21,10 +21,10 @@ package no.nibio.web.forms; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.geom.Point; -import com.vividsolutions.jts.geom.PrecisionModel; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Point; +import org.locationtech.jts.geom.PrecisionModel; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; diff --git a/src/test/java/no/nibio/vips/logic/entity/ObservationTest.java b/src/test/java/no/nibio/vips/logic/entity/ObservationTest.java index b3fc6529922d8eee10d3063045ce7a67ed928c08..d1c5c3ee961e2d1cd9832c4944be80ff0cc0fb01 100755 --- a/src/test/java/no/nibio/vips/logic/entity/ObservationTest.java +++ b/src/test/java/no/nibio/vips/logic/entity/ObservationTest.java @@ -18,9 +18,9 @@ */ package no.nibio.vips.logic.entity; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.GeometryCollection; -import com.vividsolutions.jts.geom.Point; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryCollection; +import org.locationtech.jts.geom.Point; import java.util.Date; import org.junit.After; import org.junit.AfterClass; diff --git a/src/test/java/no/nibio/vips/logic/test/mock/MockModel.java b/src/test/java/no/nibio/vips/logic/test/mock/MockModel.java index 022dab95728cd1a68831ce407bee99bd969545d8..27b0cd98b5aac157e08f3baf7dfa1e8b2ec1aa1e 100644 --- a/src/test/java/no/nibio/vips/logic/test/mock/MockModel.java +++ b/src/test/java/no/nibio/vips/logic/test/mock/MockModel.java @@ -19,8 +19,8 @@ package no.nibio.vips.logic.test.mock; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.GeometryFactory; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.GeometryFactory; import java.util.ArrayList; import java.util.Collections; import java.util.Date; diff --git a/src/test/java/no/nibio/vips/util/weather/YrWeatherForecastProviderTest.java b/src/test/java/no/nibio/vips/util/weather/YrWeatherForecastProviderTest.java index b7294e0c7ca96519f61d6081db62b27faeb6fe8f..4188d964d3d2f5bb00cf9a159a921946d1ac8c2d 100755 --- a/src/test/java/no/nibio/vips/util/weather/YrWeatherForecastProviderTest.java +++ b/src/test/java/no/nibio/vips/util/weather/YrWeatherForecastProviderTest.java @@ -18,8 +18,8 @@ */ package no.nibio.vips.util.weather; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.Point; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Point; import java.util.Collections; import java.util.List; import no.nibio.vips.entity.WeatherObservation;