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 b296e0e5154b075a1db74f27bb98e6ccca2fe4c8..a8d1cbd8b9c0efa92385da27ec474496136f89d4 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 @@ -24,6 +24,9 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; + +import no.nibio.vips.logic.controller.session.*; +import no.nibio.vips.logic.entity.*; import org.apache.http.client.utils.URIBuilder; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; @@ -36,23 +39,6 @@ import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import no.nibio.vips.gis.GISUtil; -import no.nibio.vips.logic.controller.session.ForecastBean; -import no.nibio.vips.logic.controller.session.ObservationBean; -import no.nibio.vips.logic.controller.session.PointOfInterestBean; -import no.nibio.vips.logic.controller.session.UserBean; -import no.nibio.vips.logic.entity.Country; -import no.nibio.vips.logic.entity.ForecastConfiguration; -import no.nibio.vips.logic.entity.ModelInformation; -import no.nibio.vips.logic.entity.Observation; -import no.nibio.vips.logic.entity.Organization; -import no.nibio.vips.logic.entity.PointOfInterest; -import no.nibio.vips.logic.entity.PointOfInterestExternalResource; -import no.nibio.vips.logic.entity.PointOfInterestExternalResourcePK; -import no.nibio.vips.logic.entity.PointOfInterestWeatherStation; -import no.nibio.vips.logic.entity.VipsLogicRole; -import no.nibio.vips.logic.entity.VipsLogicUser; -import no.nibio.vips.logic.entity.WeatherForecastProvider; -import no.nibio.vips.logic.entity.WeatherStationDataSource; import no.nibio.vips.logic.entity.helpers.PointOfInterestFactory; import no.nibio.vips.logic.i18n.SessionLocaleUtil; import no.nibio.vips.logic.util.Globals; @@ -81,8 +67,9 @@ public class PointOfInterestController extends HttpServlet { ForecastBean forecastBean; @EJB ObservationBean observationBean; - - + @EJB + ObservationTimeSeriesBean observationTimeSeriesBean; + /** * Processes requests for both HTTP * <code>GET</code> and @@ -795,12 +782,10 @@ public class PointOfInterestController extends HttpServlet { // Are there forecasts attached to this location List<ForecastConfiguration> forecastConfigurations = forecastBean.getForecastConfigurationsByLocation(poi); - - // TODO: Are there observations attached to this location? List<Observation> observations = observationBean.getObservationsByLocation(poi); - // - // If no strings attached, delete immediately - if(forecastConfigurations.isEmpty() && observations.isEmpty()) + List<ObservationTimeSeries> observationTimeSeries = observationTimeSeriesBean.getObservationTimeSeriesListForLocation(poi); + + if(forecastConfigurations.isEmpty() && observations.isEmpty() && observationTimeSeries.isEmpty()) { response.sendRedirect(new StringBuilder(Globals.PROTOCOL + "://") .append(ServletUtil.getServerName(request)) @@ -814,8 +799,8 @@ public class PointOfInterestController extends HttpServlet { request.setAttribute("returnURL","poi?action=editPoiForm&pointOfInterestId=" + pointOfInterestId); request.setAttribute("poi", poi); request.setAttribute("forecastConfigurations", forecastConfigurations); - // TODO Set observations request.setAttribute("observations", observations); + request.setAttribute("observationTimeSeries", observationTimeSeries); request.setAttribute("modelInformation", modelInformationMap); request.getRequestDispatcher("/poiDeletePreview.ftl").forward(request, response); } diff --git a/src/main/java/no/nibio/vips/logic/controller/session/ObservationTimeSeriesBean.java b/src/main/java/no/nibio/vips/logic/controller/session/ObservationTimeSeriesBean.java index 177b8bb1e2f28c65a19ac6659b7c6e089499fb67..d39d0954d31daa89a02ffadce35008aac2da1c55 100644 --- a/src/main/java/no/nibio/vips/logic/controller/session/ObservationTimeSeriesBean.java +++ b/src/main/java/no/nibio/vips/logic/controller/session/ObservationTimeSeriesBean.java @@ -37,6 +37,12 @@ public class ObservationTimeSeriesBean { @EJB ObservationBean observationBean; + /** + * Get list of observation time series registered by given user + * + * @param user The user + * @return a list of observation time series + */ public List<ObservationTimeSeries> getObservationTimeSeriesListForUser(VipsLogicUser user) { List<ObservationTimeSeries> resultList = em.createNamedQuery("ObservationTimeSeries.findByUserId", ObservationTimeSeries.class) .setParameter("userId", user.getUserId()) @@ -46,6 +52,18 @@ public class ObservationTimeSeriesBean { return resultList; } + /** + * Get list of observation time series registered for given poi + * + * @param poi The point of interest + * @return a list of observation time series + */ + public List<ObservationTimeSeries> getObservationTimeSeriesListForLocation(PointOfInterest poi) { + return em.createNamedQuery("ObservationTimeSeries.findByLocationPointOfInterestId", ObservationTimeSeries.class) + .setParameter("locationPointOfInterestId", poi.getPointOfInterestId()) + .getResultList(); + } + /** * Get observation time series with given id. Enrich object with user information before returning. * @param observationTimeSeriesId the id of the observation time series to retrieve @@ -142,4 +160,17 @@ public class ObservationTimeSeriesBean { o.setUser(mappedUsers.get(o.getUserId())); }); } + + /** + * Delete all observation time series registered for the given point of interest + * + * @param poi The point of interest + */ + public void deleteObservationTimeSeriesForLocation(PointOfInterest poi) { + em.createNamedQuery("ObservationTimeSeries.findByLocationPointOfInterestId", ObservationTimeSeries.class) + .setParameter("locationPointOfInterestId", poi.getPointOfInterestId()) + .getResultList().stream() + .forEach(ots -> em.remove(ots)); + + } } 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 b064c913c1388b756b042bf46fc90265a8a7f458..18dadec7afc5ce6a888e7ea4e1a4759ee4990d2d 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 @@ -72,6 +72,8 @@ public class PointOfInterestBean { ForecastBean forecastBean; @EJB ObservationBean observationBean; + @EJB + ObservationTimeSeriesBean observationTimeSeriesBean; public List<PointOfInterest> getWeatherstations(String countryCode) { @@ -467,6 +469,7 @@ public class PointOfInterestBean { PointOfInterest poi = em.find(PointOfInterest.class, pointOfInterestId); forecastBean.deleteForecastConfigurationsForLocation(poi); observationBean.deleteObservationsForLocation(poi); + observationTimeSeriesBean.deleteObservationTimeSeriesForLocation(poi); em.remove(poi); } diff --git a/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java b/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java index cfe9bc1ddad1678209b44453cdecd663a97ee96e..6ee76a5bd10118abc62872895b5225cecdcc84cf 100644 --- a/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java +++ b/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java @@ -33,7 +33,8 @@ import java.util.*; @NamedQuery(name = "ObservationTimeSeries.findAll", query = "SELECT ots FROM ObservationTimeSeries ots"), @NamedQuery(name = "ObservationTimeSeries.findByObservationTimeSeriesId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.observationTimeSeriesId = :id"), @NamedQuery(name = "ObservationTimeSeries.findByObservationTimeSeriesIds", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.observationTimeSeriesId IN :observationTimeSeriesIds"), - @NamedQuery(name = "ObservationTimeSeries.findByUserId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.userId IN(:userId) order by ots.year desc, ots.created desc") + @NamedQuery(name = "ObservationTimeSeries.findByUserId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.userId IN(:userId) order by ots.year desc, ots.created desc"), + @NamedQuery(name = "ObservationTimeSeries.findByLocationPointOfInterestId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.locationPointOfInterestId = :locationPointOfInterestId") }) public class ObservationTimeSeries implements Serializable { 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 45e66ccb3c07cf67e8342a13a850d9c322e08ad1..dbc1492bdb37c5d44edd1a160e0c7282fd8d171e 100755 --- a/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties +++ b/src/main/resources/no/nibio/vips/logic/i18n/vipslogictexts.properties @@ -1095,9 +1095,12 @@ forTimeSeries=for time series newObservationTimeSeries=New observation time series editObservationTimeSeries=Edit observation time series addNewObservationInTimeSeries=Add observation to time series -observationTimeSeriesName=Name +observationTimeSeriesName=Title observationTimeSeriesDescription=Description year=Year observationTimeSeriesDeleted = Observation time series was deleted observationTimeSeriesStored = Observation time series was stored +noTimeSeries = No observation time series +noObservations = No observations +noForecasts = No forecasts 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 cbdfdd4bf6a61411ba36c9b35f33c00c610aa6d7..0196c0acf851d7216ac2b86d432e3d8f5ace152c 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 @@ -1094,9 +1094,12 @@ forTimeSeries=for tidsserie newObservationTimeSeries=Ny tidsserie editObservationTimeSeries=Rediger tidsserie addNewObservationInTimeSeries=Legg til ny observasjon i tidsserien -observationTimeSeriesName=Navn +observationTimeSeriesName=Tittel observationTimeSeriesDescription=Beskrivelse year=\u00c5r observationTimeSeriesDeleted = Tidsserie slettet observationTimeSeriesStored = Tidsserie lagret +noTimeSeries = Ingen tidsserier +noObservations = Ingen observasjoner +noForecasts = Ingen varsler diff --git a/src/main/webapp/templates/poiDeletePreview.ftl b/src/main/webapp/templates/poiDeletePreview.ftl index 07cf886cc946dc8e8ab7a511d1cb7c41f51f22ca..7bc3ae7a548d4193858edc8522e0705b2e840705 100644 --- a/src/main/webapp/templates/poiDeletePreview.ftl +++ b/src/main/webapp/templates/poiDeletePreview.ftl @@ -38,51 +38,85 @@ </#if> <p>${i18nBundle.deletePoiPreviewExplanation}</p> <h2>${i18nBundle.forecasts}</h2> - <table class="table table-striped"> - <thead> + <#if forecastConfigurations?has_content> + <table class="table table-striped"> + <thead> <th>${i18nBundle.modelId}</th> <th>${i18nBundle.dateStart}</th> <th>${i18nBundle.dateEnd}</th> <th></th> - </thead> - <tbody> + </thead> + <tbody> <#list forecastConfigurations as forecastConfiguration> - <tr> - <td> - <#if i18nBundle.containsKey(forecastConfiguration.modelId)> - ${i18nBundle[forecastConfiguration.modelId]} - <#else> - ${modelInformation[forecastConfiguration.modelId].defaultName} - </#if> - </td> - <td>${forecastConfiguration.dateStart}</td> - <td>${forecastConfiguration.dateEnd}</td> - <td><a href="/forecastConfiguration?action=viewForecastConfiguration&forecastConfigurationId=${forecastConfiguration.forecastConfigurationId}" target="new">${i18nBundle.edit}</a></td> - </tr> + <tr> + <td> + <#if i18nBundle.containsKey(forecastConfiguration.modelId)> + ${i18nBundle[forecastConfiguration.modelId]} + <#else> + ${modelInformation[forecastConfiguration.modelId].defaultName} + </#if> + </td> + <td>${forecastConfiguration.dateStart}</td> + <td>${forecastConfiguration.dateEnd}</td> + <td><a href="/forecastConfiguration?action=viewForecastConfiguration&forecastConfigurationId=${forecastConfiguration.forecastConfigurationId}" target="new">${i18nBundle.edit}</a></td> + </tr> </#list> - </tbody> - </table> - <h2>${i18nBundle.observations}</h2> - <table class="table table-striped"> - <thead> - <th>${i18nBundle.timeOfObservation}</th> + </tbody> + </table> + <#else> + <p>${i18nBundle.noForecasts}</p> + </#if> + <h2>${i18nBundle.timeSeriesList}</h2> + <#if observationTimeSeries?has_content> + <table class="table table-striped"> + <thead> + <th>${i18nBundle.observationTimeSeriesName}</th> + <th>${i18nBundle.year}</th> + <th>${i18nBundle.cropOrganismId}</th> + <th>${i18nBundle.organism}</th> + <th></th> + </thead> + <tbody> + <#list observationTimeSeries as ots> + <tr> + <td>${ots.name}</td> + <td>${ots.year}</td> + <td>${ots.cropOrganism.latinName}</td> + <td>${ots.organism.latinName}</td> + <td><a href="/observationTimeSeries?action=editObservationTimeSeriesForm&observationTimeSeriesId=${ots.observationTimeSeriesId}" target="new">${i18nBundle.edit}</a></td> + </tr> + </#list> + </tbody> + </table> + <#else> + <p>${i18nBundle.noTimeSeries}</p> + </#if> + <h2>${i18nBundle.observations}</h2> + <#if observations?has_content> + <table class="table table-striped"> + <thead> + <th>${i18nBundle.timeOfObservation}</th> <th>${i18nBundle.cropOrganismId}</th> <th>${i18nBundle.pestOrganismId}</th> <th>${i18nBundle.observationHeading}</th> <th></th> - </thead> - <tbody> + </thead> + <tbody> <#list observations as observation> - <tr> - <td>${observation.timeOfObservation}</td> - <td>${observation.cropOrganism.latinName}</td> - <td>${observation.organism.latinName}</td> - <td>${observation.observationHeading}</td> - <td><a href="/observation?action=editObservationForm&observationId=${observation.observationId}" target="new">${i18nBundle.edit}</a></td> - </tr> + <tr> + <td>${observation.timeOfObservation}</td> + <td>${observation.cropOrganism.latinName}</td> + <td>${observation.organism.latinName}</td> + <td>${observation.observationHeading}</td> + <td><a href="/observation?action=editObservationForm&observationId=${observation.observationId}" target="new">${i18nBundle.edit}</a></td> + </tr> </#list> - </tbody> - </table> + </tbody> + </table> + <#else> + <p>${i18nBundle.noObservations}</p> + </#if> + <p> <a href="${returnURL}" class="btn btn-default cancel" role="button">${i18nBundle.cancel}</a> <button type="button" class="btn btn-danger" onclick="if(confirm('${i18nBundle.confirmDelete}')){window.location.href='/poi?action=deletePoi&pointOfInterestId=${poi.pointOfInterestId}';}">${i18nBundle.deletePoi}</button>