diff --git a/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java b/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java index 626424722cfc63ee27c0361afd0282a531edb1ff..e205348f4a9e392b952760fb525d084c284033a6 100755 --- a/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java +++ b/src/main/java/no/nibio/vips/logic/controller/session/ObservationBean.java @@ -29,18 +29,9 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.Path; import java.nio.file.StandardOpenOption; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.ResourceBundle; -import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import javax.ejb.EJB; import javax.ejb.Stateless; @@ -78,6 +69,9 @@ public class ObservationBean { @EJB UserBean userBean; + @EJB + ObservationTimeSeriesBean observationTimeSeriesBean; + public List<Observation> getObservations(Integer organizationId) { Organization organization = em.find(Organization.class, organizationId); List<Observation> observations = em.createNamedQuery("Observation.findByOrganizationId") @@ -508,6 +502,30 @@ public class ObservationBean { return observations; } + public List<Observation> getObservationsWithTimeSeries(List<Observation> observations) { + Set<Integer> observationTimeSeriesIds = observations.stream() + .map(Observation::getObservationTimeSeriesId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + if (observationTimeSeriesIds.isEmpty()) { + return observations; + } + + List<ObservationTimeSeries> timeSeriesList = observationTimeSeriesBean.getObservationTimeSeriesList(observationTimeSeriesIds); + Map<Integer, ObservationTimeSeries> timeSeriesMap = timeSeriesList.stream() + .collect(Collectors.toMap(ObservationTimeSeries::getObservationTimeSeriesId, Function.identity())); + + observations.stream() + .filter(o -> o.getObservationTimeSeriesId() != null) + .forEach(o -> o.setObservationTimeSeries(timeSeriesMap.get(o.getObservationTimeSeriesId()))); + + for (Observation o : observations) { + LOGGER.info("{}", o); + } + + return observations; + } private List<Observation> getObservationsWithObservers(List<Observation> observations) { Set<Integer> userIds = new HashSet<>(); observations.stream().filter((o) -> (o.getUserId() != null)).forEach((o) -> { @@ -642,11 +660,10 @@ public class ObservationBean { //start = new Date(); retVal = this.getObservationsWithLocations(retVal); //System.out.println("Finding locations took " + (new Date().getTime() - start.getTime()) + " milliseconds"); + retVal = this.getObservationsWithTimeSeries(retVal); } - return retVal; - } public List<Organism> getObservedPests(Integer organizationId) { 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 eb1ff5752e4d1eff1a37f6809dc23631409f396b..9f11580789bd659f6df481824248564746e2bbb8 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 @@ -18,15 +18,14 @@ package no.nibio.vips.logic.controller.session; -import no.nibio.vips.logic.entity.ObservationTimeSeries; -import no.nibio.vips.logic.entity.PointOfInterest; -import no.nibio.vips.logic.entity.VipsLogicUser; - +import java.util.*; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; -import java.util.*; +import no.nibio.vips.logic.entity.ObservationTimeSeries; +import no.nibio.vips.logic.entity.PointOfInterest; +import no.nibio.vips.logic.entity.VipsLogicUser; @Stateless public class ObservationTimeSeriesBean { @@ -49,8 +48,13 @@ public class ObservationTimeSeriesBean { return resultList; } - public ObservationTimeSeries getObservationTimeSeries(Integer id) { - ObservationTimeSeries ots = em.find(ObservationTimeSeries.class, id); + /** + * 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 + * @return the observation time series with the given id + */ + public ObservationTimeSeries getObservationTimeSeries(Integer observationTimeSeriesId) { + ObservationTimeSeries ots = em.find(ObservationTimeSeries.class, observationTimeSeriesId); if (ots != null) { ots.setUser(em.find(VipsLogicUser.class, ots.getUserId())); if (ots.getLastModifiedBy() != null) { @@ -60,6 +64,12 @@ public class ObservationTimeSeriesBean { return ots; } + public List<ObservationTimeSeries> getObservationTimeSeriesList(Set<Integer> observationTimeSeriesIds) { + return em.createNamedQuery("ObservationTimeSeries.findByObservationTimeSeriesIds") + .setParameter("observationTimeSeriesIds", observationTimeSeriesIds) + .getResultList(); + } + /** * @param ots the observation time series * @return The merged object diff --git a/src/main/java/no/nibio/vips/logic/entity/Observation.java b/src/main/java/no/nibio/vips/logic/entity/Observation.java index 190d52e6ae9a3513b9e80c0065f7b81bd47becdd..241e0c14ad16f334804c251a2f47dc698315c2f1 100755 --- a/src/main/java/no/nibio/vips/logic/entity/Observation.java +++ b/src/main/java/no/nibio/vips/logic/entity/Observation.java @@ -697,6 +697,7 @@ public class Observation implements Serializable, no.nibio.vips.observation.Obse ! this.getOrganism().getLocalName(locale).trim().isBlank() ? this.getOrganism().getLocalName(locale) : this.getOrganism().getLatinName(), this.getCropOrganismId(), ! this.getCropOrganism().getLocalName(locale).trim().isBlank() ? this.getCropOrganism().getLocalName(locale) : this.getCropOrganism().getLatinName(), + this.observationTimeSeries != null ? this.observationTimeSeries.getLabel() : null, // Specific geoInfo trumps location. This is to be interpreted // as that the observation has been geographically masked by // choice of the observer 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 b222732163440a174fb531b8d86a2fcfc4dd4ec4..d7adac276d965c3bae93528548e0128be8b5c0f3 100644 --- a/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java +++ b/src/main/java/no/nibio/vips/logic/entity/ObservationTimeSeries.java @@ -35,6 +35,7 @@ import java.util.Date; @NamedQueries({ @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.findByOrganizationId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.userId IN(SELECT v.userId FROM VipsLogicUser v WHERE v.organizationId = :organizationId OR v.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId = :organizationId))"), @NamedQuery(name = "ObservationTimeSeries.findByUserId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.userId IN(:userId)") }) @@ -163,6 +164,21 @@ public class ObservationTimeSeries implements Serializable { this.name = name; } + /** + * This logic if also implemented in the observation app, see the function timeSeriesLabel in CommonUtil.vue + * @return the first eight letters of the given name, in uppercase with spaces removed + */ + @Transient + public String getLabel() { + if (this.name == null) { + return null; + } + String timeSeriesName = this.name; + timeSeriesName = timeSeriesName.replaceAll("\\s", ""); + timeSeriesName = timeSeriesName.substring(0, Math.min(timeSeriesName.length(), 8)); + return timeSeriesName.toUpperCase(); + } + /** * @return the description of the observation time series */ diff --git a/src/main/java/no/nibio/vips/logic/entity/rest/ObservationListItem.java b/src/main/java/no/nibio/vips/logic/entity/rest/ObservationListItem.java index ddbc67e31cc1d8864b8da22a8b405344c28518b7..a4dd12f901526bfda95fb6c5edadc1c793218772 100644 --- a/src/main/java/no/nibio/vips/logic/entity/rest/ObservationListItem.java +++ b/src/main/java/no/nibio/vips/logic/entity/rest/ObservationListItem.java @@ -30,6 +30,7 @@ public class ObservationListItem implements Comparable{ private Integer observationId, observationTimeSeriesId, organismId, cropOrganismId; private Date timeOfObservation; private String organismName, cropOrganismName; + private String observationTimeSeriesLabel; private String geoInfo; private String observationHeading; private String observationData; @@ -46,6 +47,7 @@ public class ObservationListItem implements Comparable{ String organismName, Integer cropOrganismId, String cropOrganismName, + String observationTimeSeriesLabel, String geoinfo, String observationHeading, Boolean broadcastMessage, @@ -61,6 +63,7 @@ public class ObservationListItem implements Comparable{ this.organismName = organismName; this.cropOrganismId = cropOrganismId; this.cropOrganismName = cropOrganismName; + this.observationTimeSeriesLabel = observationTimeSeriesLabel; this.geoInfo = geoinfo; this.observationHeading = observationHeading; this.broadcastMessage = broadcastMessage; @@ -151,6 +154,14 @@ public class ObservationListItem implements Comparable{ this.cropOrganismName = cropOrganismName; } + public String getObservationTimeSeriesLabel() { + return observationTimeSeriesLabel; + } + + public void setObservationTimeSeriesLabel(String observationTimeSeriesLabel) { + this.observationTimeSeriesLabel = observationTimeSeriesLabel; + } + /** * @return the geoInfo */