From 7d9da833a3e37551d5d2d5084964d18e83c5f6e9 Mon Sep 17 00:00:00 2001 From: Arnaud Charleroy Date: Tue, 14 Jan 2020 12:49:04 +0100 Subject: [PATCH 1/4] Add sensor data subservice - Deprecated environment service - remove constraint on variables data --- .../resource/EnvironmentResourceService.java | 7 +- .../resource/SensorResourceService.java | 147 +++++++++++++++++- .../resource/dto/data/DataPostDTO.java | 5 +- 3 files changed, 148 insertions(+), 11 deletions(-) diff --git a/phis2-ws/src/main/java/opensilex/service/resource/EnvironmentResourceService.java b/phis2-ws/src/main/java/opensilex/service/resource/EnvironmentResourceService.java index 99c2ded88..bb8c76cda 100644 --- a/phis2-ws/src/main/java/opensilex/service/resource/EnvironmentResourceService.java +++ b/phis2-ws/src/main/java/opensilex/service/resource/EnvironmentResourceService.java @@ -53,6 +53,7 @@ */ @Api("/environments") @Path("/environments") +@Deprecated public class EnvironmentResourceService extends ResourceService { /** * Generates environmental measures from a given list of environmental measures DTOs. @@ -105,6 +106,7 @@ private List environmentMeasurePostDTOsToEnvironmentMeasure( }) @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) + @Deprecated public Response postEnvironmentMeasures( @ApiParam(value = DocumentationAnnotation.ENVIRONMENT_POST_DEFINITION) @Valid ArrayList environmentMeasures, @Context HttpServletRequest context) { @@ -191,10 +193,11 @@ public Response postEnvironmentMeasures( example = GlobalWebserviceValues.AUTHENTICATION_SCHEME + " ") }) @Produces(MediaType.APPLICATION_JSON) + @Deprecated public Response getEnvironmentMeasures( @ApiParam(value = DocumentationAnnotation.PAGE_SIZE) @QueryParam(GlobalWebserviceValues.PAGE_SIZE) @DefaultValue(DefaultBrapiPaginationValues.PAGE_SIZE) @Min(0) int pageSize, @ApiParam(value = DocumentationAnnotation.PAGE) @QueryParam(GlobalWebserviceValues.PAGE) @DefaultValue(DefaultBrapiPaginationValues.PAGE) @Min(0) int page, - @ApiParam(value = "Search by variable uri", example = DocumentationAnnotation.EXAMPLE_VARIABLE_URI, required = true) @QueryParam("variable") @URL @Required String variable, + @ApiParam(value = "Search by variable uri", example = DocumentationAnnotation.EXAMPLE_VARIABLE_URI) @QueryParam("variable") @URL @Required String variable, @ApiParam(value = "Search by minimal date", example = DocumentationAnnotation.EXAMPLE_XSDDATETIME) @QueryParam("startDate") @Date(DateFormat.YMDTHMSZ) String startDate, @ApiParam(value = "Search by maximal date", example = DocumentationAnnotation.EXAMPLE_XSDDATETIME) @QueryParam("endDate") @Date(DateFormat.YMDTHMSZ) String endDate, @ApiParam(value = "Search by sensor uri", example = DocumentationAnnotation.EXAMPLE_SENSOR_URI) @QueryParam("sensor") @URL String sensor, @@ -245,4 +248,4 @@ public Response getEnvironmentMeasures( return Response.status(Response.Status.OK).entity(getResponse).build(); } } -} +} \ No newline at end of file diff --git a/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java b/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java index 664e9c06a..76b240553 100644 --- a/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java +++ b/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java @@ -7,6 +7,7 @@ //****************************************************************************** package opensilex.service.resource; +import com.mongodb.BasicDBObjectBuilder; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -15,10 +16,10 @@ import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; -import javax.validation.constraints.Email; import javax.validation.constraints.Min; import javax.ws.rs.Consumes; import javax.ws.rs.DefaultValue; @@ -36,11 +37,14 @@ import opensilex.service.configuration.DateFormat; import opensilex.service.configuration.DefaultBrapiPaginationValues; import opensilex.service.configuration.GlobalWebserviceValues; +import opensilex.service.dao.DataDAO; +import opensilex.service.dao.ProvenanceDAO; import opensilex.service.dao.SensorDAO; import opensilex.service.dao.SensorProfileDAO; import opensilex.service.dao.exception.DAOPersistenceException; import opensilex.service.documentation.DocumentationAnnotation; import opensilex.service.documentation.StatusCodeMsg; +import opensilex.service.model.Data; import opensilex.service.resource.validation.interfaces.Date; import opensilex.service.resource.validation.interfaces.Required; import opensilex.service.resource.validation.interfaces.URL; @@ -51,12 +55,14 @@ import opensilex.service.view.brapi.form.ResponseFormPOST; import opensilex.service.result.ResultForm; import opensilex.service.model.Sensor; +import opensilex.service.resource.dto.data.DataDTO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import opensilex.service.resource.dto.sensor.SensorDTO; import opensilex.service.resource.dto.sensor.SensorDetailDTO; import opensilex.service.resource.dto.sensor.SensorPostDTO; import opensilex.service.resource.dto.sensor.SensorProfileDTO; +import opensilex.service.view.model.provenance.Provenance; /** * Sensor resource service. @@ -175,10 +181,12 @@ public Response getSensorsBySearch( SensorDAO sensorDAO = new SensorDAO(); //1. Get count Integer totalCount = sensorDAO.count(uri, rdfType, label, brand, serialNumber, model, inServiceDate, dateOfPurchase, dateOfLastCalibration, personInCharge); - - //2. Get sensors - ArrayList sensorsFounded = sensorDAO.find(page, pageSize, uri, rdfType, label, brand, serialNumber, model, inServiceDate, dateOfPurchase, dateOfLastCalibration, personInCharge); - + ArrayList sensorsFounded = new ArrayList<>(); + //2. Get sensors + if(totalCount > 0){ + sensorsFounded = sensorDAO.find(page, pageSize, uri, rdfType, label, brand, serialNumber, model, inServiceDate, dateOfPurchase, dateOfLastCalibration, personInCharge); + } + //3. Return result ArrayList statusList = new ArrayList<>(); ArrayList sensorsToReturn = new ArrayList<>(); @@ -649,4 +657,131 @@ public Response putMeasuredVariables( return Response.status(result.getHttpStatus()).entity(postResponse).build(); } -} + + /** + * Sensor Data GET service. + * @param pageSize + * @param page + * @param provenanceUri + * @param variablesUri + * @param startDate + * @param endDate + * @param object + * @param uri + * @return list of the data corresponding to the search params given + * @example + * { + * "metadata": { + * "pagination": { + * "pageSize": 20, + * "currentPage": 0, + * "totalCount": 3, + * "totalPages": 1 + * }, + * "status": [], + * "datafiles": [] + * }, + * "result": { + * "data": [ + * { + * "uri": "http://www.phenome-fppn.fr/diaphen/id/data/d2plf65my4rc2odiv2lbjgukc2zswkqyoddh25jtoy4b5pf3le3q4ec5c332f5cd44ce82977e404cebf83c", + * "provenanceUri": "http://www.phenome-fppn.fr/mtp/2018/pv181515071552", + * "objectUri": "http://www.phenome-fppn.fr/diaphen/2018/o18001199", + * "variableUri": "http://www.phenome-fppn.fr/diaphen/id/variables/v009", + * "date": "2017-06-15T00:00:00+0200", + * "value": 2.4 + * }, + * { + * "uri": "http://www.phenome-fppn.fr/diaphen/id/data/pttdrrqybxoyku4img323dyrhmpp267mhnpiw3vld2wm6tap3vwq93b344c429ec45bb9b185edfe5bc2b64", + * "provenanceUri": "http://www.phenome-fppn.fr/mtp/2018/pv181515071552", + * "objectUri": "http://www.phenome-fppn.fr/diaphen/2018/o18001199", + * "variableUri": "http://www.phenome-fppn.fr/diaphen/id/variables/v009", + * "date": "2017-06-16T00:00:00+0200", + * "value": "2017-06-15T00:00:00+0200" + * } + * ] + * } + * } + */ + @GET + @Path("{uri}/data") + @ApiOperation(value = "Get data mesured by a sensor") + @ApiResponses(value = { + @ApiResponse(code = 201, message = "Data mesured by a sensor", response = ResponseFormPOST.class), + @ApiResponse(code = 400, message = DocumentationAnnotation.BAD_USER_INFORMATION), + @ApiResponse(code = 401, message = DocumentationAnnotation.USER_NOT_AUTHORIZED), + @ApiResponse(code = 500, message = DocumentationAnnotation.ERROR_SEND_DATA) + }) + @ApiImplicitParams({ + @ApiImplicitParam(name = GlobalWebserviceValues.AUTHORIZATION, required = true, + dataType = GlobalWebserviceValues.DATA_TYPE_STRING, paramType = GlobalWebserviceValues.HEADER, + value = DocumentationAnnotation.ACCES_TOKEN, + example = GlobalWebserviceValues.AUTHENTICATION_SCHEME + " ") + }) + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response getSensorData( + @ApiParam(value = DocumentationAnnotation.PAGE_SIZE) @QueryParam(GlobalWebserviceValues.PAGE_SIZE) @DefaultValue(DefaultBrapiPaginationValues.PAGE_SIZE) @Min(0) int pageSize, + @ApiParam(value = DocumentationAnnotation.PAGE) @QueryParam(GlobalWebserviceValues.PAGE) @DefaultValue(DefaultBrapiPaginationValues.PAGE) @Min(0) int page, + @ApiParam(value = "Search by variable", example = DocumentationAnnotation.EXAMPLE_VARIABLE_URI) @QueryParam("variable") @Required String variablesUri, + @ApiParam(value = "Search by provenance", example = DocumentationAnnotation.EXAMPLE_PROVENANCE_URI) @QueryParam("provenance") String provenanceUri, + @ApiParam(value = "Search by minimal date", example = DocumentationAnnotation.EXAMPLE_XSDDATETIME) @QueryParam("startDate") @Date({DateFormat.YMDTHMSZ, DateFormat.YMD}) String startDate, + @ApiParam(value = "Search by maximal date", example = DocumentationAnnotation.EXAMPLE_XSDDATETIME) @QueryParam("endDate") @Date({DateFormat.YMDTHMSZ, DateFormat.YMD}) String endDate, + @ApiParam(value = "Search by object uri", example = DocumentationAnnotation.EXAMPLE_SCIENTIFIC_OBJECT_URI) @QueryParam("object") @URL String object, + @PathParam("uri") @Required @URL String uri + ) { + DataDAO dataDAO = new DataDAO(); + dataDAO.setPage(page); + dataDAO.setPageSize(pageSize); + + ProvenanceDAO provenanceDAO = new ProvenanceDAO(); + provenanceDAO.setPage(1); + provenanceDAO.setPageSize(500); + + ArrayList provenanceUrisAssociatedToSensor = new ArrayList<>(); + if (provenanceUri != null){ + provenanceUrisAssociatedToSensor.add(provenanceUri); + }else{ + Provenance searchProvenance = new Provenance(); + String jsonFilter = BasicDBObjectBuilder.start("metadata.prov:Agent.oeso:SensingDevice", uri).get().toString(); + ArrayList provenances = provenanceDAO.getProvenances(searchProvenance, jsonFilter); + + for (Provenance provenance : provenances) { + provenanceUrisAssociatedToSensor.add(provenance.getUri()); + } + } + List objectsUris = new ArrayList<>(); + if(object != null){ + objectsUris.add(object); + } + + //1. Get sensor data count + Integer totalCount = dataDAO.count(variablesUri, startDate, endDate, objectsUris, provenanceUrisAssociatedToSensor); + List dataFounded = new ArrayList<>(); + //2. Get sensor data + if(totalCount > 0){ + dataFounded = dataDAO.find(page, pageSize, variablesUri, startDate, endDate, objectsUris, provenanceUrisAssociatedToSensor); + } + + //3. Return result + ArrayList statusList = new ArrayList<>(); + ArrayList sensorsToReturn = new ArrayList<>(); + ResultForm getResponse; + if (dataFounded == null) { //Request failure + getResponse = new ResultForm<>(0, 0, sensorsToReturn, true); + return noResultFound(getResponse, statusList); + } else if (dataFounded.isEmpty()) { //No result found + getResponse = new ResultForm<>(0, 0, sensorsToReturn, true); + return noResultFound(getResponse, statusList); + } else { //Results + //Convert all objects to DTOs + dataFounded.forEach((data) -> { + sensorsToReturn.add(new DataDTO(data)); + }); + + getResponse = new ResultForm<>(pageSize, page, sensorsToReturn, true, totalCount); + getResponse.setStatus(statusList); + return Response.status(Response.Status.OK).entity(getResponse).build(); + } + } +} \ No newline at end of file diff --git a/phis2-ws/src/main/java/opensilex/service/resource/dto/data/DataPostDTO.java b/phis2-ws/src/main/java/opensilex/service/resource/dto/data/DataPostDTO.java index 90bae4863..91c3bb29d 100644 --- a/phis2-ws/src/main/java/opensilex/service/resource/dto/data/DataPostDTO.java +++ b/phis2-ws/src/main/java/opensilex/service/resource/dto/data/DataPostDTO.java @@ -56,8 +56,7 @@ public class DataPostDTO extends AbstractVerifiedClass { protected Object value; @URL - @Required - @ApiModelProperty(example = DocumentationAnnotation.EXAMPLE_SENSOR_URI) + @ApiModelProperty(example = DocumentationAnnotation.EXAMPLE_SCIENTIFIC_OBJECT_URI) public String getObjectUri() { return objectUri; } @@ -161,4 +160,4 @@ private BigDecimal getBigDecimalOrNullIfInvalid(String value) { return null; } } -} +} \ No newline at end of file From a15d1208b320c3514e32c25a1a913be6050e4502 Mon Sep 17 00:00:00 2001 From: Arnaud Charleroy Date: Tue, 25 Feb 2020 09:25:41 +0100 Subject: [PATCH 2/4] Update remove environment --- .../java/opensilex/service/dao/DataDAO.java | 4 +- .../resource/EnvironmentResourceService.java | 187 ++++++++++++------ .../resource/SensorResourceService.java | 2 +- 3 files changed, 129 insertions(+), 64 deletions(-) diff --git a/phis2-ws/src/main/java/opensilex/service/dao/DataDAO.java b/phis2-ws/src/main/java/opensilex/service/dao/DataDAO.java index cc7918655..05b846a34 100644 --- a/phis2-ws/src/main/java/opensilex/service/dao/DataDAO.java +++ b/phis2-ws/src/main/java/opensilex/service/dao/DataDAO.java @@ -439,7 +439,7 @@ protected BasicDBObject prepareSearchQuery(String variableUri, String startDate, } // Objects filter - if (!objectsUris.isEmpty()) { + if (objectsUris != null && !objectsUris.isEmpty()) { if (objectsUris.size() > 1) { BasicDBList or = new BasicDBList(); for (String objectUri : objectsUris) { @@ -453,7 +453,7 @@ protected BasicDBObject prepareSearchQuery(String variableUri, String startDate, } //Provenance filter - if (!provenancesUris.isEmpty()) { + if (provenancesUris != null && !provenancesUris.isEmpty()) { if (provenancesUris.size() > 1) { BasicDBList or = new BasicDBList(); for (String provenanceUri : provenancesUris) { diff --git a/phis2-ws/src/main/java/opensilex/service/resource/EnvironmentResourceService.java b/phis2-ws/src/main/java/opensilex/service/resource/EnvironmentResourceService.java index bb8c76cda..23a0cc3f7 100644 --- a/phis2-ws/src/main/java/opensilex/service/resource/EnvironmentResourceService.java +++ b/phis2-ws/src/main/java/opensilex/service/resource/EnvironmentResourceService.java @@ -7,6 +7,7 @@ //****************************************************************************** package opensilex.service.resource; +import com.mongodb.BasicDBObjectBuilder; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -14,7 +15,11 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import java.math.BigDecimal; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import opensilex.service.resource.validation.interfaces.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; @@ -32,20 +37,23 @@ import opensilex.service.configuration.DateFormat; import opensilex.service.configuration.DefaultBrapiPaginationValues; import opensilex.service.configuration.GlobalWebserviceValues; -import opensilex.service.dao.EnvironmentMeasureDAO; +import opensilex.service.dao.DataDAO; +import opensilex.service.dao.ProvenanceDAO; import opensilex.service.documentation.DocumentationAnnotation; import opensilex.service.documentation.StatusCodeMsg; -import opensilex.service.resource.dto.environment.EnvironmentMeasureDTO; +import opensilex.service.model.Data; import opensilex.service.resource.dto.environment.EnvironmentMeasurePostDTO; -import opensilex.service.resource.validation.interfaces.Date; -import opensilex.service.resource.validation.interfaces.Required; -import opensilex.service.resource.validation.interfaces.URL; import opensilex.service.utils.POSTResultsReturn; import opensilex.service.view.brapi.Status; import opensilex.service.view.brapi.form.AbstractResultForm; import opensilex.service.view.brapi.form.ResponseFormPOST; -import opensilex.service.result.ResultForm; import opensilex.service.model.EnvironmentMeasure; +import opensilex.service.resource.dto.data.DataDTO; +import opensilex.service.resource.dto.environment.EnvironmentMeasureDTO; +import opensilex.service.resource.validation.interfaces.Required; +import opensilex.service.resource.validation.interfaces.URL; +import opensilex.service.result.ResultForm; +import opensilex.service.view.model.provenance.Provenance; /** * Environmental measure resource service. @@ -108,40 +116,90 @@ private List environmentMeasurePostDTOsToEnvironmentMeasure( @Produces(MediaType.APPLICATION_JSON) @Deprecated public Response postEnvironmentMeasures( - @ApiParam(value = DocumentationAnnotation.ENVIRONMENT_POST_DEFINITION) @Valid ArrayList environmentMeasures, + @ApiParam(value = DocumentationAnnotation.ENVIRONMENT_POST_DEFINITION) @Valid ArrayList data, @Context HttpServletRequest context) { AbstractResultForm postResponse = null; - if (environmentMeasures != null && !environmentMeasures.isEmpty()) { - EnvironmentMeasureDAO environmentDAO = new EnvironmentMeasureDAO(); - - environmentDAO.user = userSession.getUser(); - - POSTResultsReturn result = environmentDAO.checkAndInsert(environmentMeasurePostDTOsToEnvironmentMeasure(environmentMeasures)); - - if (result.getHttpStatus().equals(Response.Status.CREATED)) { - postResponse = new ResponseFormPOST(result.statusList); - postResponse.getMetadata().setDatafiles(result.getCreatedResources()); - } else if (result.getHttpStatus().equals(Response.Status.BAD_REQUEST) - || result.getHttpStatus().equals(Response.Status.OK) - || result.getHttpStatus().equals(Response.Status.INTERNAL_SERVER_ERROR)) { - postResponse = new ResponseFormPOST(result.statusList); - } - return Response.status(result.getHttpStatus()).entity(postResponse).build(); - } else { - postResponse = new ResponseFormPOST(new Status(StatusCodeMsg.REQUEST_ERROR, StatusCodeMsg.ERR, "Empty environment measure(s) to add")); + try { + if (data != null && !data.isEmpty()) { + DataDAO dataDAO = new DataDAO(); + + dataDAO.user = userSession.getUser(); + + POSTResultsReturn result = dataDAO.checkAndInsert(environmentMeasurePostDTOTOsToData(data)); + + if (result.getHttpStatus().equals(Response.Status.CREATED)) { + postResponse = new ResponseFormPOST(result.statusList); + postResponse.getMetadata().setDatafiles(result.getCreatedResources()); + } else if (result.getHttpStatus().equals(Response.Status.BAD_REQUEST) + || result.getHttpStatus().equals(Response.Status.OK) + || result.getHttpStatus().equals(Response.Status.INTERNAL_SERVER_ERROR)) { + postResponse = new ResponseFormPOST(result.statusList); + } + return Response.status(result.getHttpStatus()).entity(postResponse).build(); + } else { + postResponse = new ResponseFormPOST(new Status(StatusCodeMsg.REQUEST_ERROR, StatusCodeMsg.ERR, "No data to add")); + return Response.status(Response.Status.BAD_REQUEST).entity(postResponse).build(); + } + } catch (ParseException e) { + postResponse = new ResponseFormPOST(new Status(StatusCodeMsg.REQUEST_ERROR, StatusCodeMsg.ERR, e.getMessage())); return Response.status(Response.Status.BAD_REQUEST).entity(postResponse).build(); - } + } } + /** + * Generates an data list from a given list of EnvironmentMeasurePostDTO. + * @param dataDTOs + * @return the list of data + */ + private List environmentMeasurePostDTOTOsToData(List dataDTOs) throws ParseException { + ArrayList dataList = new ArrayList<>(); + + for (EnvironmentMeasurePostDTO dataDTO : dataDTOs) { + Data data = new Data(); + SimpleDateFormat parser = new SimpleDateFormat(DateFormat.YMDTHMSZ.toString()); + java.util.Date date = parser.parse(dataDTO.getDate()); + data.setDate(date); + data.setObjectUri(null); + data.setProvenanceUri(dataDTO.getDate()); + data.setValue(dataDTO.getValue()); + data.setVariableUri(dataDTO.getVariableUri()); + dataList.add(data); + } + + return dataList; + } + + + /** + * Generates an data list from a given list of EnvironmentMeasurePostDTO. + * @param dataDTOs + * @return the list of data + */ + private List DataenvironmentToMeasurePostDTOTOs(List dataDTOs) throws ParseException { + ArrayList dataList = new ArrayList<>(); + + for (Data dataDTO : dataDTOs) { + EnvironmentMeasurePostDTO environmentMeasurePostDTO = new EnvironmentMeasurePostDTO(); + SimpleDateFormat formatter = new SimpleDateFormat(DateFormat.YMDTHMSZ.toString()); + environmentMeasurePostDTO.setDate(formatter.format(dataDTO.getDate())); + environmentMeasurePostDTO.setProvenanceUri(dataDTO.getDate()); + environmentMeasurePostDTO.setValue((BigDecimal) dataDTO.getValue()); + environmentMeasurePostDTO.setVariableUri(dataDTO.getVariableUri()); + dataList.add(environmentMeasurePostDTO); + } + + return dataList; + } + /** * Service to get environment measures. * @param pageSize * @param page - * @param variable + * @param variableUri * @param startDate * @param endDate - * @param sensor + * @param sensorUri * @param dateSortAsc * @return list of the environment measures corresponding to the search parameters given * @example @@ -197,53 +255,60 @@ public Response postEnvironmentMeasures( public Response getEnvironmentMeasures( @ApiParam(value = DocumentationAnnotation.PAGE_SIZE) @QueryParam(GlobalWebserviceValues.PAGE_SIZE) @DefaultValue(DefaultBrapiPaginationValues.PAGE_SIZE) @Min(0) int pageSize, @ApiParam(value = DocumentationAnnotation.PAGE) @QueryParam(GlobalWebserviceValues.PAGE) @DefaultValue(DefaultBrapiPaginationValues.PAGE) @Min(0) int page, - @ApiParam(value = "Search by variable uri", example = DocumentationAnnotation.EXAMPLE_VARIABLE_URI) @QueryParam("variable") @URL @Required String variable, + @ApiParam(value = "Search by variable uri", example = DocumentationAnnotation.EXAMPLE_VARIABLE_URI) @QueryParam("variable") @URL @Required String variableUri, @ApiParam(value = "Search by minimal date", example = DocumentationAnnotation.EXAMPLE_XSDDATETIME) @QueryParam("startDate") @Date(DateFormat.YMDTHMSZ) String startDate, @ApiParam(value = "Search by maximal date", example = DocumentationAnnotation.EXAMPLE_XSDDATETIME) @QueryParam("endDate") @Date(DateFormat.YMDTHMSZ) String endDate, - @ApiParam(value = "Search by sensor uri", example = DocumentationAnnotation.EXAMPLE_SENSOR_URI) @QueryParam("sensor") @URL String sensor, + @ApiParam(value = "Search by sensor uri", example = DocumentationAnnotation.EXAMPLE_SENSOR_URI) @QueryParam("sensor") @URL String sensorUri, @ApiParam(value = "Date search result order ('true' for ascending and 'false' for descending)", example = "true") @QueryParam("dateSortAsc") boolean dateSortAsc ) { - // 1. Initialize environmentDAO with parameters - EnvironmentMeasureDAO environmentMeasureDAO = new EnvironmentMeasureDAO(); - - environmentMeasureDAO.variableUri = variable; + // 1. Initialize dataDAO with parameters + DataDAO dataDAO = new DataDAO(); + + dataDAO.user = userSession.getUser(); + dataDAO.setPage(page); + dataDAO.setPageSize(pageSize); - environmentMeasureDAO.startDate = startDate; - environmentMeasureDAO.endDate = endDate; - environmentMeasureDAO.sensorUri = sensor; - environmentMeasureDAO.dateSortAsc = dateSortAsc; + ProvenanceDAO provenanceDAO = new ProvenanceDAO(); + provenanceDAO.setPage(1); + provenanceDAO.setPageSize(1000); - environmentMeasureDAO.user = userSession.getUser(); - environmentMeasureDAO.setPage(page); - environmentMeasureDAO.setPageSize(pageSize); + ArrayList provenanceUrisAssociatedToSensor = new ArrayList<>(); + if (sensorUri != null){ + Provenance searchProvenance = new Provenance(); + String jsonFilter = BasicDBObjectBuilder.start("metadata.prov:Agent.prov:id", sensorUri).get().toString(); + ArrayList provenances = provenanceDAO.getProvenances(searchProvenance, jsonFilter); + + for (Provenance provenance : provenances) { + provenanceUrisAssociatedToSensor.add(provenance.getUri()); + } + } - // 2. Get environment measures count - int totalCount = environmentMeasureDAO.count(); - // 3. Get environment measures page list - ArrayList measures = environmentMeasureDAO.allPaginate(); + //1. Get sensor data count + Integer totalCount = dataDAO.count(variableUri, startDate, endDate, null, provenanceUrisAssociatedToSensor); + List dataFounded = new ArrayList<>(); + //2. Get sensor data + if(totalCount > 0){ + dataFounded = dataDAO.find(page, pageSize, variableUri, startDate, endDate, null, provenanceUrisAssociatedToSensor); + } - // 4. Initialize return variables - ArrayList list = new ArrayList<>(); + //3. Return result ArrayList statusList = new ArrayList<>(); - ResultForm getResponse; - - if (measures == null) { - // Request failure - getResponse = new ResultForm<>(0, 0, list, true, 0); + ArrayList sensorsToReturn = new ArrayList<>(); + ResultForm getResponse; + if (dataFounded == null) { //Request failure + getResponse = new ResultForm<>(0, 0, sensorsToReturn, true); return noResultFound(getResponse, statusList); - } else if (measures.isEmpty()) { - // No results - getResponse = new ResultForm<>(0, 0, list, true, 0); + } else if (dataFounded.isEmpty()) { //No result found + getResponse = new ResultForm<>(0, 0, sensorsToReturn, true); return noResultFound(getResponse, statusList); - } else { - // Convert all measures object to DTO's - measures.forEach((measure) -> { - list.add(new EnvironmentMeasureDTO(measure)); + } else { //Results + //Convert all objects to DTOs + dataFounded.forEach((data) -> { + sensorsToReturn.add(new DataDTO(data)); }); - // Return list of DTO - getResponse = new ResultForm<>(environmentMeasureDAO.getPageSize(), environmentMeasureDAO.getPage(), list, true, totalCount); + getResponse = new ResultForm<>(pageSize, page, sensorsToReturn, true, totalCount); getResponse.setStatus(statusList); return Response.status(Response.Status.OK).entity(getResponse).build(); } diff --git a/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java b/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java index 76b240553..8935543bf 100644 --- a/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java +++ b/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java @@ -743,7 +743,7 @@ public Response getSensorData( provenanceUrisAssociatedToSensor.add(provenanceUri); }else{ Provenance searchProvenance = new Provenance(); - String jsonFilter = BasicDBObjectBuilder.start("metadata.prov:Agent.oeso:SensingDevice", uri).get().toString(); + String jsonFilter = BasicDBObjectBuilder.start("metadata.prov:Agent.prov:id", uri).get().toString(); ArrayList provenances = provenanceDAO.getProvenances(searchProvenance, jsonFilter); for (Provenance provenance : provenances) { From 15c7b0c5e76fa0d5ad48b4ac70a7efbe1a30dad0 Mon Sep 17 00:00:00 2001 From: Arnaud Charleroy Date: Wed, 26 Feb 2020 18:04:31 +0100 Subject: [PATCH 3/4] Update environment service --- .../service/documentation/StatusCodeMsg.java | 8 +- .../resource/EnvironmentResourceService.java | 196 ++++++------------ .../resource/SensorResourceService.java | 3 +- 3 files changed, 76 insertions(+), 131 deletions(-) diff --git a/phis2-ws/src/main/java/opensilex/service/documentation/StatusCodeMsg.java b/phis2-ws/src/main/java/opensilex/service/documentation/StatusCodeMsg.java index ddefd61be..038f51483 100644 --- a/phis2-ws/src/main/java/opensilex/service/documentation/StatusCodeMsg.java +++ b/phis2-ws/src/main/java/opensilex/service/documentation/StatusCodeMsg.java @@ -12,7 +12,7 @@ /** * Web service return messages. * @see phenomeapi.service.view.brapi.Status - * @author Arnaud Charleroy , Morgane Vidal + * @author Arnaud Charleroy, Morgane Vidal */ @Singleton public final class StatusCodeMsg { @@ -28,6 +28,7 @@ public final class StatusCodeMsg { public static final String DATA_ERROR = "Data error"; public static final String DATA_INSERTED = "Data inserted"; public static final String DATA_REJECTED = "Data rejected"; + public static final String API_DEPRECATED_INFO_MESSAGE = "This api service should no longer be used. It will be change or removed"; public static final String ERR = "Error"; public static final String ERROR_WHILE_COMMITTING_OR_ROLLING_BACK_TRIPLESTORE_STATEMENT = "Error while committing or rolling back Triplestore statements: "; public static final String EMPTY_EVENT_LIST = "The event list to create is empty"; @@ -36,6 +37,7 @@ public final class StatusCodeMsg { public static final String FILE_ERROR = "File error"; public static final String INFO = "Info"; public static final String INTERNAL_ERROR = "An internal error occured. Please contact the administrator."; + public static final String INVALID_INPUT_PARAMETERS = "Wrong format parameter(s)"; public static final String MALFORMED_CREATE_QUERY = "Malformed create query"; public static final String MALFORMED_UPDATE_QUERY = "Malformed update query"; public static final String MALFORMED_URI = "Malformed URI"; @@ -57,5 +59,7 @@ public final class StatusCodeMsg { public static final String UNKNOWN_TYPE = "Unknown type %s"; public static final String UNKNOWN_EVENT_URI = "Unknown event URI"; public static final String WRONG_VALUE = "Wrong value"; - public static final String INVALID_INPUT_PARAMETERS = "Wrong format parameter(s)"; + public static final String WARNING = "Warning"; + + } diff --git a/phis2-ws/src/main/java/opensilex/service/resource/EnvironmentResourceService.java b/phis2-ws/src/main/java/opensilex/service/resource/EnvironmentResourceService.java index 23a0cc3f7..f0fd54e71 100644 --- a/phis2-ws/src/main/java/opensilex/service/resource/EnvironmentResourceService.java +++ b/phis2-ws/src/main/java/opensilex/service/resource/EnvironmentResourceService.java @@ -7,7 +7,6 @@ //****************************************************************************** package opensilex.service.resource; -import com.mongodb.BasicDBObjectBuilder; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -15,11 +14,7 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; -import java.math.BigDecimal; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import opensilex.service.resource.validation.interfaces.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; @@ -37,32 +32,32 @@ import opensilex.service.configuration.DateFormat; import opensilex.service.configuration.DefaultBrapiPaginationValues; import opensilex.service.configuration.GlobalWebserviceValues; -import opensilex.service.dao.DataDAO; -import opensilex.service.dao.ProvenanceDAO; +import opensilex.service.dao.EnvironmentMeasureDAO; import opensilex.service.documentation.DocumentationAnnotation; import opensilex.service.documentation.StatusCodeMsg; -import opensilex.service.model.Data; +import opensilex.service.resource.dto.environment.EnvironmentMeasureDTO; import opensilex.service.resource.dto.environment.EnvironmentMeasurePostDTO; +import opensilex.service.resource.validation.interfaces.Date; +import opensilex.service.resource.validation.interfaces.Required; +import opensilex.service.resource.validation.interfaces.URL; import opensilex.service.utils.POSTResultsReturn; import opensilex.service.view.brapi.Status; import opensilex.service.view.brapi.form.AbstractResultForm; import opensilex.service.view.brapi.form.ResponseFormPOST; -import opensilex.service.model.EnvironmentMeasure; -import opensilex.service.resource.dto.data.DataDTO; -import opensilex.service.resource.dto.environment.EnvironmentMeasureDTO; -import opensilex.service.resource.validation.interfaces.Required; -import opensilex.service.resource.validation.interfaces.URL; import opensilex.service.result.ResultForm; -import opensilex.service.view.model.provenance.Provenance; +import opensilex.service.model.EnvironmentMeasure; /** * Environmental measure resource service. - * @author Morgane Vidal + * @author Morgane Vidal */ @Api("/environments") @Path("/environments") @Deprecated public class EnvironmentResourceService extends ResourceService { + + private final Status deprecatedStatus = new Status(StatusCodeMsg.WARNING, StatusCodeMsg.WARNING, StatusCodeMsg.API_DEPRECATED_INFO_MESSAGE); + /** * Generates environmental measures from a given list of environmental measures DTOs. * @param environmentMeasureDTOs @@ -116,90 +111,44 @@ private List environmentMeasurePostDTOsToEnvironmentMeasure( @Produces(MediaType.APPLICATION_JSON) @Deprecated public Response postEnvironmentMeasures( - @ApiParam(value = DocumentationAnnotation.ENVIRONMENT_POST_DEFINITION) @Valid ArrayList data, + @ApiParam(value = DocumentationAnnotation.ENVIRONMENT_POST_DEFINITION) @Valid ArrayList environmentMeasures, @Context HttpServletRequest context) { AbstractResultForm postResponse = null; - try { - if (data != null && !data.isEmpty()) { - DataDAO dataDAO = new DataDAO(); - - dataDAO.user = userSession.getUser(); - - POSTResultsReturn result = dataDAO.checkAndInsert(environmentMeasurePostDTOTOsToData(data)); + if (environmentMeasures != null && !environmentMeasures.isEmpty()) { + EnvironmentMeasureDAO environmentDAO = new EnvironmentMeasureDAO(); + + environmentDAO.user = userSession.getUser(); + + POSTResultsReturn result = environmentDAO.checkAndInsert(environmentMeasurePostDTOsToEnvironmentMeasure(environmentMeasures)); + result.statusList.add(deprecatedStatus); - if (result.getHttpStatus().equals(Response.Status.CREATED)) { - postResponse = new ResponseFormPOST(result.statusList); - postResponse.getMetadata().setDatafiles(result.getCreatedResources()); - } else if (result.getHttpStatus().equals(Response.Status.BAD_REQUEST) - || result.getHttpStatus().equals(Response.Status.OK) - || result.getHttpStatus().equals(Response.Status.INTERNAL_SERVER_ERROR)) { - postResponse = new ResponseFormPOST(result.statusList); - } - return Response.status(result.getHttpStatus()).entity(postResponse).build(); - } else { - postResponse = new ResponseFormPOST(new Status(StatusCodeMsg.REQUEST_ERROR, StatusCodeMsg.ERR, "No data to add")); - return Response.status(Response.Status.BAD_REQUEST).entity(postResponse).build(); - } - } catch (ParseException e) { - postResponse = new ResponseFormPOST(new Status(StatusCodeMsg.REQUEST_ERROR, StatusCodeMsg.ERR, e.getMessage())); + if (result.getHttpStatus().equals(Response.Status.CREATED)) { + postResponse = new ResponseFormPOST(result.statusList); + postResponse.getMetadata().setDatafiles(result.getCreatedResources()); + } else if (result.getHttpStatus().equals(Response.Status.BAD_REQUEST) + || result.getHttpStatus().equals(Response.Status.OK) + || result.getHttpStatus().equals(Response.Status.INTERNAL_SERVER_ERROR)) { + postResponse = new ResponseFormPOST(result.statusList); + } + return Response.status(result.getHttpStatus()).entity(postResponse).build(); + } else { + List statusList = new ArrayList<>(); + statusList.add(new Status(StatusCodeMsg.REQUEST_ERROR, StatusCodeMsg.ERR, "Empty environment measure(s) to add")); + statusList.add(deprecatedStatus); + postResponse = new ResponseFormPOST(statusList); return Response.status(Response.Status.BAD_REQUEST).entity(postResponse).build(); - } + } } - /** - * Generates an data list from a given list of EnvironmentMeasurePostDTO. - * @param dataDTOs - * @return the list of data - */ - private List environmentMeasurePostDTOTOsToData(List dataDTOs) throws ParseException { - ArrayList dataList = new ArrayList<>(); - - for (EnvironmentMeasurePostDTO dataDTO : dataDTOs) { - Data data = new Data(); - SimpleDateFormat parser = new SimpleDateFormat(DateFormat.YMDTHMSZ.toString()); - java.util.Date date = parser.parse(dataDTO.getDate()); - data.setDate(date); - data.setObjectUri(null); - data.setProvenanceUri(dataDTO.getDate()); - data.setValue(dataDTO.getValue()); - data.setVariableUri(dataDTO.getVariableUri()); - dataList.add(data); - } - - return dataList; - } - - - /** - * Generates an data list from a given list of EnvironmentMeasurePostDTO. - * @param dataDTOs - * @return the list of data - */ - private List DataenvironmentToMeasurePostDTOTOs(List dataDTOs) throws ParseException { - ArrayList dataList = new ArrayList<>(); - - for (Data dataDTO : dataDTOs) { - EnvironmentMeasurePostDTO environmentMeasurePostDTO = new EnvironmentMeasurePostDTO(); - SimpleDateFormat formatter = new SimpleDateFormat(DateFormat.YMDTHMSZ.toString()); - environmentMeasurePostDTO.setDate(formatter.format(dataDTO.getDate())); - environmentMeasurePostDTO.setProvenanceUri(dataDTO.getDate()); - environmentMeasurePostDTO.setValue((BigDecimal) dataDTO.getValue()); - environmentMeasurePostDTO.setVariableUri(dataDTO.getVariableUri()); - dataList.add(environmentMeasurePostDTO); - } - - return dataList; - } - /** * Service to get environment measures. * @param pageSize * @param page - * @param variableUri + * @param variable * @param startDate * @param endDate - * @param sensorUri + * @param sensor * @param dateSortAsc * @return list of the environment measures corresponding to the search parameters given * @example @@ -255,62 +204,55 @@ private List DataenvironmentToMeasurePostDTOTOs(List< public Response getEnvironmentMeasures( @ApiParam(value = DocumentationAnnotation.PAGE_SIZE) @QueryParam(GlobalWebserviceValues.PAGE_SIZE) @DefaultValue(DefaultBrapiPaginationValues.PAGE_SIZE) @Min(0) int pageSize, @ApiParam(value = DocumentationAnnotation.PAGE) @QueryParam(GlobalWebserviceValues.PAGE) @DefaultValue(DefaultBrapiPaginationValues.PAGE) @Min(0) int page, - @ApiParam(value = "Search by variable uri", example = DocumentationAnnotation.EXAMPLE_VARIABLE_URI) @QueryParam("variable") @URL @Required String variableUri, + @ApiParam(value = "Search by variable uri", example = DocumentationAnnotation.EXAMPLE_VARIABLE_URI, required = true) @QueryParam("variable") @URL @Required String variable, @ApiParam(value = "Search by minimal date", example = DocumentationAnnotation.EXAMPLE_XSDDATETIME) @QueryParam("startDate") @Date(DateFormat.YMDTHMSZ) String startDate, @ApiParam(value = "Search by maximal date", example = DocumentationAnnotation.EXAMPLE_XSDDATETIME) @QueryParam("endDate") @Date(DateFormat.YMDTHMSZ) String endDate, - @ApiParam(value = "Search by sensor uri", example = DocumentationAnnotation.EXAMPLE_SENSOR_URI) @QueryParam("sensor") @URL String sensorUri, + @ApiParam(value = "Search by sensor uri", example = DocumentationAnnotation.EXAMPLE_SENSOR_URI) @QueryParam("sensor") @URL String sensor, @ApiParam(value = "Date search result order ('true' for ascending and 'false' for descending)", example = "true") @QueryParam("dateSortAsc") boolean dateSortAsc ) { - // 1. Initialize dataDAO with parameters - DataDAO dataDAO = new DataDAO(); - - dataDAO.user = userSession.getUser(); - dataDAO.setPage(page); - dataDAO.setPageSize(pageSize); - - ProvenanceDAO provenanceDAO = new ProvenanceDAO(); - provenanceDAO.setPage(1); - provenanceDAO.setPageSize(1000); + // 1. Initialize environmentDAO with parameters + EnvironmentMeasureDAO environmentMeasureDAO = new EnvironmentMeasureDAO(); - ArrayList provenanceUrisAssociatedToSensor = new ArrayList<>(); - if (sensorUri != null){ - Provenance searchProvenance = new Provenance(); - String jsonFilter = BasicDBObjectBuilder.start("metadata.prov:Agent.prov:id", sensorUri).get().toString(); - ArrayList provenances = provenanceDAO.getProvenances(searchProvenance, jsonFilter); + environmentMeasureDAO.variableUri = variable; - for (Provenance provenance : provenances) { - provenanceUrisAssociatedToSensor.add(provenance.getUri()); - } - } + environmentMeasureDAO.startDate = startDate; + environmentMeasureDAO.endDate = endDate; + environmentMeasureDAO.sensorUri = sensor; + environmentMeasureDAO.dateSortAsc = dateSortAsc; + environmentMeasureDAO.user = userSession.getUser(); + environmentMeasureDAO.setPage(page); + environmentMeasureDAO.setPageSize(pageSize); - //1. Get sensor data count - Integer totalCount = dataDAO.count(variableUri, startDate, endDate, null, provenanceUrisAssociatedToSensor); - List dataFounded = new ArrayList<>(); - //2. Get sensor data - if(totalCount > 0){ - dataFounded = dataDAO.find(page, pageSize, variableUri, startDate, endDate, null, provenanceUrisAssociatedToSensor); - } + // 2. Get environment measures count + int totalCount = environmentMeasureDAO.count(); + + // 3. Get environment measures page list + ArrayList measures = environmentMeasureDAO.allPaginate(); - //3. Return result + // 4. Initialize return variables + ArrayList list = new ArrayList<>(); ArrayList statusList = new ArrayList<>(); - ArrayList sensorsToReturn = new ArrayList<>(); - ResultForm getResponse; - if (dataFounded == null) { //Request failure - getResponse = new ResultForm<>(0, 0, sensorsToReturn, true); + ResultForm getResponse; + statusList.add(deprecatedStatus); + if (measures == null) { + // Request failure + getResponse = new ResultForm<>(0, 0, list, true, 0); return noResultFound(getResponse, statusList); - } else if (dataFounded.isEmpty()) { //No result found - getResponse = new ResultForm<>(0, 0, sensorsToReturn, true); + } else if (measures.isEmpty()) { + // No results + getResponse = new ResultForm<>(0, 0, list, true, 0); return noResultFound(getResponse, statusList); - } else { //Results - //Convert all objects to DTOs - dataFounded.forEach((data) -> { - sensorsToReturn.add(new DataDTO(data)); + } else { + // Convert all measures object to DTO's + measures.forEach((measure) -> { + list.add(new EnvironmentMeasureDTO(measure)); }); - getResponse = new ResultForm<>(pageSize, page, sensorsToReturn, true, totalCount); + // Return list of DTO + getResponse = new ResultForm<>(environmentMeasureDAO.getPageSize(), environmentMeasureDAO.getPage(), list, true, totalCount); getResponse.setStatus(statusList); return Response.status(Response.Status.OK).entity(getResponse).build(); } } -} \ No newline at end of file +} diff --git a/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java b/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java index 8935543bf..1d099caf7 100644 --- a/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java +++ b/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java @@ -16,7 +16,6 @@ import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; @@ -67,7 +66,7 @@ /** * Sensor resource service. * @update [Andreas Garcia] 15 Apr. 2019: handle DAO persistence exceptions thrown by property DAO functions. - * @author Morgane Vidal + * @author Morgane Vidal */ @Api("/sensors") @Path("/sensors") From 247be64059fa99d1d5a29d78ec1aa440f9128720 Mon Sep 17 00:00:00 2001 From: Arnaud Charleroy Date: Wed, 11 Mar 2020 13:59:32 +0100 Subject: [PATCH 4/4] Update sensor data service --- .../resource/SensorResourceService.java | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java b/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java index 1d099caf7..e0de792fb 100644 --- a/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java +++ b/phis2-ws/src/main/java/opensilex/service/resource/SensorResourceService.java @@ -659,6 +659,7 @@ public Response putMeasuredVariables( /** * Sensor Data GET service. + * * @param pageSize * @param page * @param provenanceUri @@ -720,27 +721,28 @@ public Response putMeasuredVariables( @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getSensorData( - @ApiParam(value = DocumentationAnnotation.PAGE_SIZE) @QueryParam(GlobalWebserviceValues.PAGE_SIZE) @DefaultValue(DefaultBrapiPaginationValues.PAGE_SIZE) @Min(0) int pageSize, - @ApiParam(value = DocumentationAnnotation.PAGE) @QueryParam(GlobalWebserviceValues.PAGE) @DefaultValue(DefaultBrapiPaginationValues.PAGE) @Min(0) int page, - @ApiParam(value = "Search by variable", example = DocumentationAnnotation.EXAMPLE_VARIABLE_URI) @QueryParam("variable") @Required String variablesUri, - @ApiParam(value = "Search by provenance", example = DocumentationAnnotation.EXAMPLE_PROVENANCE_URI) @QueryParam("provenance") String provenanceUri, + @PathParam("uri") @Required @URL String uri, + @ApiParam(value = "Search by variable", example = DocumentationAnnotation.EXAMPLE_VARIABLE_URI, required = true) @QueryParam("variable") @Required @URL String variablesUri, + @ApiParam(value = "Search by provenance", example = DocumentationAnnotation.EXAMPLE_PROVENANCE_URI) @QueryParam("provenance") @URL String provenanceUri, @ApiParam(value = "Search by minimal date", example = DocumentationAnnotation.EXAMPLE_XSDDATETIME) @QueryParam("startDate") @Date({DateFormat.YMDTHMSZ, DateFormat.YMD}) String startDate, @ApiParam(value = "Search by maximal date", example = DocumentationAnnotation.EXAMPLE_XSDDATETIME) @QueryParam("endDate") @Date({DateFormat.YMDTHMSZ, DateFormat.YMD}) String endDate, - @ApiParam(value = "Search by object uri", example = DocumentationAnnotation.EXAMPLE_SCIENTIFIC_OBJECT_URI) @QueryParam("object") @URL String object, - @PathParam("uri") @Required @URL String uri + @ApiParam(value = "Search by object uri", example = DocumentationAnnotation.EXAMPLE_SCIENTIFIC_OBJECT_URI) @QueryParam("object") @URL String object, + @ApiParam(value = DocumentationAnnotation.PAGE_SIZE) @QueryParam(GlobalWebserviceValues.PAGE_SIZE) @DefaultValue(DefaultBrapiPaginationValues.PAGE_SIZE) @Min(0) int pageSize, + @ApiParam(value = DocumentationAnnotation.PAGE) @QueryParam(GlobalWebserviceValues.PAGE) @DefaultValue(DefaultBrapiPaginationValues.PAGE) @Min(0) int page ) { DataDAO dataDAO = new DataDAO(); dataDAO.setPage(page); dataDAO.setPageSize(pageSize); - ProvenanceDAO provenanceDAO = new ProvenanceDAO(); - provenanceDAO.setPage(1); + ProvenanceDAO provenanceDAO = new ProvenanceDAO(); + provenanceDAO.setPage(0); provenanceDAO.setPageSize(500); - + + //1. Get associated sensors ArrayList provenanceUrisAssociatedToSensor = new ArrayList<>(); - if (provenanceUri != null){ + if (provenanceUri != null) { provenanceUrisAssociatedToSensor.add(provenanceUri); - }else{ + } else { Provenance searchProvenance = new Provenance(); String jsonFilter = BasicDBObjectBuilder.start("metadata.prov:Agent.prov:id", uri).get().toString(); ArrayList provenances = provenanceDAO.getProvenances(searchProvenance, jsonFilter); @@ -750,19 +752,20 @@ public Response getSensorData( } } List objectsUris = new ArrayList<>(); - if(object != null){ - objectsUris.add(object); - } - - //1. Get sensor data count - Integer totalCount = dataDAO.count(variablesUri, startDate, endDate, objectsUris, provenanceUrisAssociatedToSensor); List dataFounded = new ArrayList<>(); - //2. Get sensor data - if(totalCount > 0){ - dataFounded = dataDAO.find(page, pageSize, variablesUri, startDate, endDate, objectsUris, provenanceUrisAssociatedToSensor); + Integer totalCount = 0; + if (!provenanceUrisAssociatedToSensor.isEmpty()) { + if (object != null) { + objectsUris.add(object); + } + //2. Get sensor data count + totalCount = dataDAO.count(variablesUri, startDate, endDate, objectsUris, provenanceUrisAssociatedToSensor); + //3. Get sensor data + if (totalCount > 0) { + dataFounded = dataDAO.find(page, pageSize, variablesUri, startDate, endDate, objectsUris, provenanceUrisAssociatedToSensor); + } } - - //3. Return result + //4. Return result ArrayList statusList = new ArrayList<>(); ArrayList sensorsToReturn = new ArrayList<>(); ResultForm getResponse; @@ -777,7 +780,7 @@ public Response getSensorData( dataFounded.forEach((data) -> { sensorsToReturn.add(new DataDTO(data)); }); - + getResponse = new ResultForm<>(pageSize, page, sensorsToReturn, true, totalCount); getResponse.setStatus(statusList); return Response.status(Response.Status.OK).entity(getResponse).build();