diff --git a/src/main/java/no/nibio/vips/logic/entity/VipsLogicRole.java b/src/main/java/no/nibio/vips/logic/entity/VipsLogicRole.java index 5aaee47188e3f7de922c0cc0152be15954eef7cb..0bafed3d02c8c2758d9a24c48583d37bdb4b29a9 100755 --- a/src/main/java/no/nibio/vips/logic/entity/VipsLogicRole.java +++ b/src/main/java/no/nibio/vips/logic/entity/VipsLogicRole.java @@ -127,7 +127,9 @@ public class VipsLogicRole implements Serializable { @Override public String toString() { - return "no.nibio.vips.logic.entity.VipslogicRole[ vipslogicRoleId=" + vipsLogicRoleId + " ]"; + return "VipsLogicRole{" + + "vipsLogicRoleId=" + vipsLogicRoleId + + ", defaultTitle='" + defaultTitle + '\'' + + '}'; } - } diff --git a/src/main/java/no/nibio/vips/logic/service/ObservationService.java b/src/main/java/no/nibio/vips/logic/service/ObservationService.java index a6a9604ba915a4f4207869b4818d19ba329175e9..cd767b23fe1e3be8b589c27ab8acbffcf7eb10b0 100755 --- a/src/main/java/no/nibio/vips/logic/service/ObservationService.java +++ b/src/main/java/no/nibio/vips/logic/service/ObservationService.java @@ -277,7 +277,7 @@ public class ObservationService { from = fromStr != null ? format.parse(fromStr) : null; to = toStr != null ? format.parse(toStr) : null; } catch (ParseException ex) { - System.out.println("ERROR"); + LOGGER.error("Error when parsing dates", ex); } return observationBean.getFilteredObservations( @@ -422,7 +422,7 @@ public class ObservationService { from = fromStr != null ? format.parse(fromStr) : null; to = toStr != null ? format.parse(toStr) : null; } catch (ParseException ex) { - System.out.println("ERROR"); + LOGGER.error("Error when parsing dates", ex); } List<Observation> filteredObservations = this.getFilteredObservationsFromBackend( @@ -500,10 +500,13 @@ public class ObservationService { public Response getObservationsForUser( @QueryParam("observationIds") String observationIds ) { + LOGGER.info("getObservationsForUser for observationIds={}", observationIds); try { VipsLogicUser user = userBean.getUserFromUUID(httpServletRequest); if (user != null) { + LOGGER.info("Get observations for user={}", user.getUserId()); List<Observation> allObs = observationBean.getObservationsForUser(user); + LOGGER.info("Found {} observations for user {}", allObs.size(), user.getUserId()); if (observationIds != null) { Set<Integer> observationIdSet = Arrays.asList(observationIds.split(",")).stream() .map(s -> Integer.valueOf(s)) @@ -520,6 +523,7 @@ public class ObservationService { return Response.status(Status.UNAUTHORIZED).build(); } } catch (Exception e) { + LOGGER.error("Exception when getting observations for user", e); return Response.serverError().entity(e.getMessage()).build(); } } @@ -622,7 +626,6 @@ public class ObservationService { // This means the user wants to hide the exact location, // so mask for all users except super and orgadmin else if (o.getPolygonService() != null) { - //System.out.println("Masking observation"); List<Observation> intermediary = new ArrayList<>(); intermediary.add(o); intermediary = this.maskObservations(o.getPolygonService(), @@ -908,6 +911,7 @@ public class ObservationService { try { VipsLogicUser user = userBean.getUserFromUUID(httpServletRequest); if (user == null) { + LOGGER.warn("Unable to get user from UUID"); return Response.status(Status.UNAUTHORIZED).build(); } ObjectMapper oM = new ObjectMapper(); @@ -915,6 +919,8 @@ public class ObservationService { try { Map<Object, Object> mapFromApp = oM.readValue(observationJson, new TypeReference<HashMap<Object, Object>>() { }); + LOGGER.info("Syncing for user {} with roles {}. mapFromApp.get(\"userId\")={}", user.getUserId(), user.getVipsLogicRoles(), mapFromApp.get("userId")); + // Check if it is marked as deleted or not if (mapFromApp.get("deleted") != null && ((Boolean) mapFromApp.get("deleted").equals(true))) { if (observationBean.getObservation((Integer) mapFromApp.get("observationId")) != null) { @@ -925,13 +931,16 @@ public class ObservationService { } } else { Integer observationId = (Integer) mapFromApp.get("observationId"); + Date now = new Date(); // For setting timestamps + Observation mergeObs; - if(observationId > 0) { + if(observationId > 0) { // Observation already in database mergeObs = observationBean.getObservation(observationId); if (mergeObs == null) { + LOGGER.warn("Observation with id {} not found", observationId); return Response.status(Status.NOT_FOUND).build(); } - } else { + } else { // New observation! mergeObs = new Observation("APP"); } @@ -954,15 +963,25 @@ public class ObservationService { mergeObs.setObservationHeading(mapFromApp.get("observationHeading") != null ? (String) mapFromApp.get("observationHeading") : null); mergeObs.setObservationText(mapFromApp.get("observationText") != null ? (String) mapFromApp.get("observationText") : null); mergeObs.setBroadcastMessage(mapFromApp.get("broadcastMessage") != null ? (Boolean) mapFromApp.get("broadcastMessage") : false); - mergeObs.setStatusTypeId((Integer) mapFromApp.get("statusTypeId")); + // If the user has the role of observation approver, change to approved if set to pending - if (mergeObs.getStatusTypeId().equals(ObservationStatusType.STATUS_PENDING) && user.isObservationAuthority()) { - mergeObs.setStatusTypeId(ObservationStatusType.STATUS_APPROVED); + Integer newStatusTypeId = (Integer) mapFromApp.get("statusTypeId"); + if(newStatusTypeId != null) { + Integer originalStatusTypeId = mergeObs.getStatusTypeId(); + if (newStatusTypeId.equals(ObservationStatusType.STATUS_PENDING) && user.isObservationAuthority()) { + LOGGER.info("Change status from pending to approved for observation {}", mergeObs.getObservationId()); + mergeObs.setStatusChangedByUserId(user.getUserId()); + mergeObs.setStatusChangedTime(now); + mergeObs.setStatusTypeId(ObservationStatusType.STATUS_APPROVED); + } else if(!newStatusTypeId.equals(originalStatusTypeId)) { + LOGGER.info("Change status from {} to {} for observation {}", originalStatusTypeId, newStatusTypeId, mergeObs.getObservationId()); + mergeObs.setStatusChangedByUserId(user.getUserId()); + mergeObs.setStatusChangedTime(now); + mergeObs.setStatusTypeId(newStatusTypeId); + } + // If status type id has not changed, leave the fields as they are } - mergeObs.setStatusChangedByUserId(mapFromApp.get("userId") != null ? (Integer) mapFromApp.get("userId") : null); - mergeObs.setStatusChangedTime(mapFromApp.get("timeOfObservation") != null ? oM.convertValue(mapFromApp.get("timeOfObservation"), new TypeReference<Date>() { - }) : null); - mergeObs.setStatusRemarks(mapFromApp.get("statusRemarks") != null ? (String) mapFromApp.get("statusRemarks") : null); + mergeObs.setIsQuantified(mapFromApp.get("isQuantified") != null ? (Boolean) mapFromApp.get("isQuantified") : false); mergeObs.setLocationIsPrivate(mapFromApp.get("locationIsPrivate") != null ? (Boolean) mapFromApp.get("locationIsPrivate") : false); Object polygonServiceValue = mapFromApp.get("polygonService"); @@ -974,7 +993,7 @@ public class ObservationService { mergeObs.setObservationDataSchema(observationBean.getObservationDataSchema(user.getOrganization_id(), mergeObs.getOrganismId())); mergeObs.setObservationData(mapFromApp.get("observationData") != null ? mapFromApp.get("observationData").toString() : null); mergeObs.setLastEditedBy(user.getUserId()); - mergeObs.setLastEditedTime(new Date()); + mergeObs.setLastEditedTime(now); // Input check before storing // Location must be set @@ -1015,14 +1034,14 @@ public class ObservationService { } } } - LOGGER.info("sendNotification? " + sendNotification); + boolean messagingSystemDisabled = System.getProperty("DISABLE_MESSAGING_SYSTEM") != null && System.getProperty("DISABLE_MESSAGING_SYSTEM").equals("true"); + LOGGER.info("Notification should be sent? " + sendNotification); + LOGGER.info("Messaging system is disabled? " + messagingSystemDisabled); // All transactions finished, we can send notifications // if conditions are met - if (sendNotification && ! - (System.getProperty("DISABLE_MESSAGING_SYSTEM") != null && System.getProperty("DISABLE_MESSAGING_SYSTEM").equals("true")) - ) { - LOGGER.debug("Sending the message!"); + if (sendNotification && !messagingSystemDisabled) { + LOGGER.info("Sending the message!"); messagingBean.sendUniversalMessage(mergeObs); } diff --git a/src/main/java/no/nibio/vips/logic/service/ObservationTimeSeriesService.java b/src/main/java/no/nibio/vips/logic/service/ObservationTimeSeriesService.java index dc2aa0e64b9dd06d5f22013ff74a62e169cfdf46..643e0ea134d665a8fd6fe14e85366c2c333ffdf4 100644 --- a/src/main/java/no/nibio/vips/logic/service/ObservationTimeSeriesService.java +++ b/src/main/java/no/nibio/vips/logic/service/ObservationTimeSeriesService.java @@ -175,8 +175,10 @@ public class ObservationTimeSeriesService { LOGGER.info(jsonOts); VipsLogicUser user = userBean.getUserFromUUID(httpServletRequest); if (user == null) { + LOGGER.warn("Unable to get user from UUID"); return Response.status(Response.Status.UNAUTHORIZED).build(); } + LOGGER.info("Syncing for user {} with roles {}", user.getUserId(), user.getVipsLogicRoles()); ObjectMapper oM = new ObjectMapper(); try { Map<Object, Object> mapFromApp = oM.readValue(jsonOts, new TypeReference<HashMap<Object, Object>>() { @@ -188,7 +190,8 @@ public class ObservationTimeSeriesService { Boolean isDeleted = (Boolean) mapFromApp.getOrDefault(DELETED, false); if (isDeleted) { // If marked as deleted, delete the observation time series if it exists - // Observations in time series are also deleted, but the app currently prevents this. + // Observations in time series are also deleted, but the app currently prevents + // deletion of time series with content if (observationTimeSeriesBean.getObservationTimeSeries(otsId) != null) { observationTimeSeriesBean.deleteObservationTimeSeries(otsId); LOGGER.info("ObservationTimeSeries with id={} deleted", otsId);