Skip to content
Snippets Groups Projects
Commit d328bf21 authored by Lene Wasskog's avatar Lene Wasskog
Browse files

fix: Ensure locations are correctly masked for observation time series

parent 44a5821e
No related branches found
No related tags found
No related merge requests found
...@@ -18,22 +18,22 @@ ...@@ -18,22 +18,22 @@
package no.nibio.vips.logic.entity; package no.nibio.vips.logic.entity;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*; import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull; import no.nibio.vips.logic.util.GISEntityUtil;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlRootElement;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.*;
@Entity @Entity
@Table(name = "observation_time_series") @Table(name = "observation_time_series")
@XmlRootElement @XmlRootElement
@NamedQueries({ @NamedQueries({
@NamedQuery(name = "ObservationTimeSeries.findAll", query = "SELECT ots FROM ObservationTimeSeries ots"), @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.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.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 = :organizationId OR v.organizationId.organizationId IN(SELECT o.organizationId FROM Organization o WHERE o.parentOrganizationId.organizationId = :organizationId))"), @NamedQuery(name = "ObservationTimeSeries.findByUserId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.userId IN(:userId)")
@NamedQuery(name = "ObservationTimeSeries.findByUserId", query = "SELECT ots FROM ObservationTimeSeries ots WHERE ots.userId IN(:userId)")
}) })
public class ObservationTimeSeries implements Serializable { public class ObservationTimeSeries implements Serializable {
...@@ -53,10 +53,14 @@ public class ObservationTimeSeries implements Serializable { ...@@ -53,10 +53,14 @@ public class ObservationTimeSeries implements Serializable {
private VipsLogicUser lastModifiedByUser; // Transient private VipsLogicUser lastModifiedByUser; // Transient
private Integer locationPointOfInterestId; private Integer locationPointOfInterestId;
private PointOfInterest locationPointOfInterest; private PointOfInterest locationPointOfInterest;
private List<Gis> geoInfoList;
private Boolean locationIsPrivate; private Boolean locationIsPrivate;
private PolygonService polygonService; private PolygonService polygonService;
private GISEntityUtil GISEntityUtil;
public ObservationTimeSeries() { public ObservationTimeSeries() {
this.GISEntityUtil = new GISEntityUtil();
} }
public ObservationTimeSeries(String source) { public ObservationTimeSeries(String source) {
...@@ -324,6 +328,17 @@ public class ObservationTimeSeries implements Serializable { ...@@ -324,6 +328,17 @@ public class ObservationTimeSeries implements Serializable {
this.locationPointOfInterest = locationPointOfInterest; this.locationPointOfInterest = locationPointOfInterest;
} }
public void setGeoInfoList(List<Gis> geoInfoList) {
this.geoInfoList = geoInfoList;
}
@Transient
public String getGeoInfo() {
Map<String, Object> properties = new HashMap<>();
properties.put("observationTimeSeriesId", this.getObservationTimeSeriesId());
return this.GISEntityUtil.getGeoJSONFromGis(this.geoInfoList, properties);
}
/** /**
* @return the locationIsPrivate * @return the locationIsPrivate
*/ */
...@@ -373,24 +388,25 @@ public class ObservationTimeSeries implements Serializable { ...@@ -373,24 +388,25 @@ public class ObservationTimeSeries implements Serializable {
@Override @Override
public String toString() { public String toString() {
return "ObservationTimeSeries{" + return "ObservationTimeSeries{" +
"observationTimeSeriesId=" + observationTimeSeriesId + "observationTimeSeriesId=" + observationTimeSeriesId +
", cropOrganism=" + cropOrganism + ", cropOrganism=" + cropOrganism +
", organism=" + organism + ", organism=" + organism +
", year=" + year + ", year=" + year +
", name='" + name + '\'' + ", name='" + name + '\'' +
", description='" + description + '\'' + ", description='" + description + '\'' +
", created=" + created + ", created=" + created +
", userId=" + userId + ", userId=" + userId +
", user=" + user + ", user=" + user +
", source=" + source + ", source=" + source +
", lastModified=" + lastModified + ", lastModified=" + lastModified +
", lastModifiedBy=" + lastModifiedBy + ", lastModifiedBy=" + lastModifiedBy +
", lastModifiedByUser=" + lastModifiedByUser + ", lastModifiedByUser=" + lastModifiedByUser +
", locationPointOfInterestId=" + locationPointOfInterestId + ", locationPointOfInterestId=" + locationPointOfInterestId +
", locationPointOfInterest=" + locationPointOfInterest + ", locationPointOfInterest=" + locationPointOfInterest +
", locationIsPrivate=" + locationIsPrivate + ", geoInfoList=" + geoInfoList +
", polygonService=" + polygonService + ", locationIsPrivate=" + locationIsPrivate +
'}'; ", polygonService=" + polygonService +
'}';
} }
public int compareTo(ObservationTimeSeries other) { public int compareTo(ObservationTimeSeries other) {
......
...@@ -33,9 +33,9 @@ import java.util.stream.Collectors; ...@@ -33,9 +33,9 @@ import java.util.stream.Collectors;
@Path("rest/observationtimeseries") @Path("rest/observationtimeseries")
public class ObservationTimeSeriesService { public class ObservationTimeSeriesService {
private final static Logger LOGGER = LoggerFactory.getLogger(ObservationTimeSeriesService.class);
public static final String APPLICATION_JSON = "application/json;charset=UTF-8"; public static final String APPLICATION_JSON = "application/json;charset=UTF-8";
private final static Logger LOGGER = LoggerFactory.getLogger(ObservationTimeSeriesService.class);
private static final String DELETED = "deleted"; private static final String DELETED = "deleted";
private static final String OBSERVATION_TIME_SERIES_ID = "observationTimeSeriesId"; private static final String OBSERVATION_TIME_SERIES_ID = "observationTimeSeriesId";
private static final String ORGANISM_ID = "organismId"; private static final String ORGANISM_ID = "organismId";
...@@ -62,7 +62,6 @@ public class ObservationTimeSeriesService { ...@@ -62,7 +62,6 @@ public class ObservationTimeSeriesService {
@Produces(APPLICATION_JSON) @Produces(APPLICATION_JSON)
@TypeHint(ObservationTimeSeries[].class) @TypeHint(ObservationTimeSeries[].class)
public Response getObservationsTimeSeriesForUser(@QueryParam("observationTimeSeriesIds") String otsIds) { public Response getObservationsTimeSeriesForUser(@QueryParam("observationTimeSeriesIds") String otsIds) {
LOGGER.info("In getObservationsTimeSeriesForUser observationTimeSeriesIds=" + otsIds);
try { try {
VipsLogicUser user = userBean.getUserFromUUID(httpServletRequest); VipsLogicUser user = userBean.getUserFromUUID(httpServletRequest);
if (user != null) { if (user != null) {
...@@ -112,9 +111,15 @@ public class ObservationTimeSeriesService { ...@@ -112,9 +111,15 @@ public class ObservationTimeSeriesService {
boolean requesterNotValidUser = requester == null; boolean requesterNotValidUser = requester == null;
boolean requesterRegularUser = requester != null && !requester.isSuperUser() && !requester.isOrganizationAdmin(); boolean requesterRegularUser = requester != null && !requester.isSuperUser() && !requester.isOrganizationAdmin();
boolean requesterNotCreator = requester != null && !ots.getUserId().equals(requester.getUserId()); boolean requesterNotCreator = requester != null && !ots.getUserId().equals(requester.getUserId());
if (requesterNotValidUser || requesterRegularUser) { if (requesterNotValidUser || requesterRegularUser) {
// Hide completely for all users except creator, super and orgadmin
if (ots.getLocationIsPrivate() && (requesterNotValidUser || requesterNotCreator)) {
ots.setGeoInfoList(new ArrayList<>());
}
// Mask for all users except creator, super and orgadmin // Mask for all users except creator, super and orgadmin
if (!(ots.getLocationIsPrivate() && (requesterNotValidUser || requesterNotCreator)) && ots.getPolygonService() != null) { else if (ots.getPolygonService() != null) {
observationTimeSeriesBean.enrichObservationTimeSeriesWithPointOfInterest(ots);
this.maskLocation(ots.getPolygonService(), ots); this.maskLocation(ots.getPolygonService(), ots);
} }
} }
...@@ -141,16 +146,17 @@ public class ObservationTimeSeriesService { ...@@ -141,16 +146,17 @@ public class ObservationTimeSeriesService {
// We need to loop through the observations and find corresponding featurecollections and replace those // We need to loop through the observations and find corresponding featurecollections and replace those
Map<Integer, Feature> indexedPolygons = new HashMap<>(); Map<Integer, Feature> indexedPolygons = new HashMap<>();
for (Feature feature : response.getFeatureCollection().getFeatures()) { for (Feature feature : response.getFeatureCollection().getFeatures()) {
indexedPolygons.put((Integer) feature.getProperties().get(OBSERVATION_TIME_SERIES_ID), feature); indexedPolygons.put((Integer) feature.getProperties().get("id"), feature);
} }
GISEntityUtil gisEntityUtil = new GISEntityUtil(); GISEntityUtil gisEntityUtil = new GISEntityUtil();
for (Map mapping : response.getMapping()) { for (Map mapping : response.getMapping()) {
Integer observationTimeSeriesId = Integer.valueOf((String) mapping.get(OBSERVATION_TIME_SERIES_ID)); Integer observationTimeSeriesId = Integer.valueOf((String) mapping.get("id"));
if (observationTimeSeries.getObservationTimeSeriesId().equals(observationTimeSeriesId)) { if (observationTimeSeries.getObservationTimeSeriesId().equals(observationTimeSeriesId)) {
Integer borderId = (Integer) mapping.get("borderid"); Integer borderId = (Integer) mapping.get("borderid");
Gis polygon = gisEntityUtil.getGisFromFeature(indexedPolygons.get(borderId)); Gis polygon = gisEntityUtil.getGisFromFeature(indexedPolygons.get(borderId));
List<Gis> gis = new ArrayList<>(); List<Gis> gis = new ArrayList<>();
gis.add(polygon); gis.add(polygon);
observationTimeSeries.setGeoInfoList(gis);
observationTimeSeries.setLocationPointOfInterest(null); observationTimeSeries.setLocationPointOfInterest(null);
observationTimeSeries.setLocationPointOfInterestId(null); observationTimeSeries.setLocationPointOfInterestId(null);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment