@Override public void validateRequestMessageOnPut(final DataInputMessage requestMessage) throws MessageValidationException { Assert.notNull(requestMessage); if (CollectionUtils.isEmpty(requestMessage.getObservations())) { throw new MessageValidationException("To publish data is mandatory to fill in the observations field"); } for (final Observation observation : requestMessage.getObservations()) { if (observation.getValue() == null) { throw new MessageValidationException("To publish data is mandatory to fill in the value field"); } } super.validateRequestMessageOnPut(requestMessage); }
protected void publishCounterEvent(final PlatformInputMessage inputMessage, final Metric metric, final int totalResourcesRejected) { switch (metric.eventType()) { case DATA: final int totalDataResources = ((DataInputMessage) inputMessage).getObservations().size() - totalResourcesRejected; publishCounterEvent(metric.requestType(), metric.eventType(), totalDataResources); break; default: final int totalResources = 1 - totalResourcesRejected; publishCounterEvent(metric.requestType(), metric.eventType(), totalResources); break; } }
public void setAdvice(final JoinPoint jp, final PlatformInputMessage inputMessage, final Metric metric) { switch (metric.eventType()) { case DATA: publishCounterEvent(metric.requestType(), metric.eventType(), ((DataInputMessage) inputMessage).getObservations().size()); break; default: publishCounterEvent(metric.requestType(), metric.eventType(), 1); break; } return; }
@Override public void onPut(final SentiloRequest request, final SentiloResponse response) { LOGGER.debug("Executing data PUT request"); debug(request); // The request follows the following pattern: // PUT /data/{providerId}/{sensorId}/{sensorValue} // where URI parameters {sensorId} and {sensorValue} are not mandatory. // If {sensorId} is not filled in then request will have a message on the body validateResourceNumberParts(request, 1, 3); final DataInputMessage inputMessage = parser.parsePutRequest(request); validator.validateRequestMessageOnPut(inputMessage); validateWriteAccess(request.getEntitySource(), inputMessage.getProviderId()); LOGGER.info("Entity {} has published a message with {} observations associated with {} sensors", request.getEntitySource(), inputMessage.getObservations().size(), inputMessage.getProviderId()); dataService.setObservations(inputMessage); }
@Metric(requestType = RequestType.PUT, eventType = EventType.DATA) public void setObservations(final DataInputMessage message) { final List<Observation> observations = message.getObservations(); final RejectedResourcesContext rejectedContext = new RejectedResourcesContext(); for (final Observation observation : observations) { try { checkTargetResourceState(observation); setObservation(observation); } catch (final ResourceNotFoundException rnfe) { rejectedContext.rejectEvent(observation.getSensor(), rnfe.getMessage()); LOGGER.warn("Observation [{}] has been rejected because sensor [{}], belonging to provider [{}], doesn't exist on Sentilo.", observation.getValue(), observation.getSensor(), observation.getProvider()); } catch (final ResourceOfflineException roe) { rejectedContext.rejectEvent(observation.getSensor(), roe.getMessage()); LOGGER.warn("Observation [{}] has been rejected because sensor [{}], belonging to provider [{}], is not online.", observation.getValue(), observation.getSensor(), observation.getProvider()); } } if (!rejectedContext.isEmpty()) { throw new EventRejectedException(EventType.DATA, rejectedContext); } }