@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); }
public DataInputMessage parseDeleteRequest(final SentiloRequest request) throws PlatformException { final SentiloResource resource = request.getResource(); final String providerId = resource.getResourcePart(0); final String sensorId = resource.getResourcePart(1); return new DataInputMessage(providerId, sensorId); }
public void deleteLastObservations(final DataInputMessage message) { if (StringUtils.hasText(message.getSensorId())) { deleteLastObservation(message.getProviderId(), message.getSensorId()); } else { deleteLastObservations(message.getProviderId()); } }
@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); }
@Override public void onDelete(final SentiloRequest request, final SentiloResponse response) { LOGGER.debug("Executing data DELETE request"); debug(request); // The request follows the following pattern: // DELETE /data/{providerId}/{sensorId} // where URI parameter {sensorId} is not mandatory validateResourceNumberParts(request, 1, 2); final DataInputMessage inputMessage = parser.parseDeleteRequest(request); validator.validateRequestMessageOnDelete(inputMessage); validateWriteAccess(request.getEntitySource(), inputMessage.getProviderId()); dataService.deleteLastObservations(inputMessage); }
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; } }
@Override public void onGet(final SentiloRequest request, final SentiloResponse response) { LOGGER.debug("Executing data GET request"); debug(request); // The request follows the following pattern: // GET /data/{providerId}/{sensorId} // where URI parameter {sensorId} is not mandatory // Furthermore, it could have parameters validateResourceNumberParts(request, 1, 2); final DataInputMessage inputMessage = parser.parseGetRequest(request); validator.validateRequestMessageOnGet(inputMessage); validateReadAccess(request.getEntitySource(), inputMessage.getProviderId()); final List<Observation> lastObservations = dataService.getLastObservations(inputMessage); parser.writeResponse(request, response, lastObservations); }
@Metric(requestType = RequestType.GET, eventType = EventType.DATA) public List<Observation> getLastObservations(final DataInputMessage message) { // Para recuperar las observaciones del sensor / sensores de un proveedor, debemos hacer lo // siguiente: // 1. Recuperar los identificadores internos de los sensores de los cuales queremos recuperar // las observaciones. // 2. Para cada sensor, recuperar las observaciones que cumplen el criterio de busqueda final List<Observation> globalObservations = new ArrayList<Observation>(); final Set<String> sids = resourceService.getSensorsToInspect(message.getProviderId(), message.getSensorId()); if (CollectionUtils.isEmpty(sids)) { LOGGER.debug("Provider [{}] has not sensors registered", message.getProviderId()); return globalObservations; } LOGGER.debug("Retrieving last observations for {} sensors belonging to provider [{}]", sids.size(), message.getProviderId()); final Iterator<String> it = sids.iterator(); while (it.hasNext()) { final String sid = it.next(); final List<Observation> observationsFromSensor = getLastObservations(sid, message); if (!CollectionUtils.isEmpty(observationsFromSensor)) { globalObservations.addAll(observationsFromSensor); } } return globalObservations; }
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; }
public DataInputMessage parsePutRequest(final SentiloRequest request) throws PlatformException { final SentiloResource resource = request.getResource(); List<Observation> observations = null; DataInputMessage message = null; if (resource.getParts().length == 3) { final String providerId = resource.getResourcePart(0); final String sensorId = resource.getResourcePart(1); final String value = resource.getResourcePart(2); final Observation observation = new Observation(providerId, sensorId, value); observations = new ArrayList<Observation>(); observations.add(observation); message = new DataInputMessage(providerId, sensorId, observations); } else if (resource.getParts().length == 1) { final String providerId = resource.getResourcePart(0); final SensorsMessage inputMessage = (SensorsMessage) readInternal(SensorsMessage.class, request); observations = inputMessageToDomain(resource, inputMessage); message = new DataInputMessage(providerId, observations); } else { final String providerId = resource.getResourcePart(0); final String sensorId = resource.getResourcePart(1); final ObservationsMessage inputMessage = (ObservationsMessage) readInternal(ObservationsMessage.class, request); observations = inputMessageToDomain(resource, inputMessage); message = new DataInputMessage(providerId, sensorId, observations); } return message; }
@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); } }
public DataInputMessage parseGetRequest(final SentiloRequest request) throws PlatformException { final SentiloResource resource = request.getResource(); final String providerId = resource.getResourcePart(0); final String sensorId = resource.getResourcePart(1); final String from = request.getRequestParameter("from"); final String to = request.getRequestParameter("to"); final String limit = request.getRequestParameter("limit"); return new DataInputMessage(providerId, sensorId, parseDate(from), parseDate(to), parseInteger(limit)); }