diff --git a/opensilex-brapi/src/main/java/org/opensilex/brapi/api/StudiesAPI.java b/opensilex-brapi/src/main/java/org/opensilex/brapi/api/StudiesAPI.java index 088706c19..2fb37c5fe 100644 --- a/opensilex-brapi/src/main/java/org/opensilex/brapi/api/StudiesAPI.java +++ b/opensilex-brapi/src/main/java/org/opensilex/brapi/api/StudiesAPI.java @@ -346,7 +346,8 @@ public Response getObservationUnits( ontologyDAO, moveEventDAO, geospatialDAO, - germplasmDAO); + germplasmDAO, + sparql); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/opensilex-brapi/src/main/java/org/opensilex/brapi/model/BrAPIv1LocationDTO.java b/opensilex-brapi/src/main/java/org/opensilex/brapi/model/BrAPIv1LocationDTO.java index 0872f2d75..8a76bb948 100644 --- a/opensilex-brapi/src/main/java/org/opensilex/brapi/model/BrAPIv1LocationDTO.java +++ b/opensilex-brapi/src/main/java/org/opensilex/brapi/model/BrAPIv1LocationDTO.java @@ -8,6 +8,7 @@ import com.mongodb.client.model.geojson.Geometry; +import org.apache.commons.lang3.StringUtils; import org.locationtech.jts.geom.Point; import org.locationtech.jts.io.geojson.GeoJsonReader; import org.opensilex.core.organisation.dal.OrganizationDAO; @@ -16,7 +17,9 @@ import org.opensilex.core.organisation.dal.facility.FacilityDAO; import org.opensilex.core.organisation.dal.facility.FacilityModel; import org.opensilex.core.organisation.dal.site.SiteAddressModel; +import org.opensilex.core.organisation.dal.site.SiteModel; import org.opensilex.security.account.dal.AccountModel; +import org.opensilex.server.exceptions.BadRequestException; import org.opensilex.server.rest.validation.model.OpenSilexLocale; import java.util.*; @@ -176,7 +179,8 @@ public BrAPIv1LocationDTO extractFromModel(FacilityModel model, FacilityDAO faci } catch (Exception e) { throw new RuntimeException(e); } - if (parentModel.getSites().size() == 1) { + List sitesAddresses = parentModel.getSites().stream().map(SiteModel::getAddress).collect(Collectors.toList()); + if (sitesAddresses.stream().anyMatch(Objects::nonNull) && sitesAddresses.size() == 1) { return parentModel; } else { return null; @@ -185,7 +189,19 @@ public BrAPIv1LocationDTO extractFromModel(FacilityModel model, FacilityDAO faci if (parentsWithOneAddress.size()==1) { // If exactly one organisation on this level with exactly one site OrganizationModel institute = organizationDAO.get(parentsWithOneAddress.get(0).getUri(), currentAccount); SiteAddressModel parentAddress = institute.getSites().get(0).getAddress(); - this.setInstituteAddress(parentAddress.toString()); + this.setInstituteAddress( + StringUtils.join( + parentAddress.getStreetAddress(), + "\n", + parentAddress.getLocality(), + "\n", + parentAddress.getRegion(), + "\n", + parentAddress.getPostalCode(), + "\n", + parentAddress.getCountryName() + ) + ); this.setInstituteName(institute.getName()); String countryName = parentAddress.getCountryName(); this.setCountryName(countryName); @@ -207,7 +223,11 @@ public BrAPIv1LocationDTO extractFromModel(FacilityModel model, FacilityDAO faci if (model.getAddress() != null && !model.getAddress().toString().isEmpty()){ String countryName = model.getAddress().getCountryName(); this.setCountryName(countryName); - this.setCountryCode(new OpenSilexLocale(countryName).getISO3Country()); + try { + this.setCountryCode(new OpenSilexLocale(countryName).getISO3Country()); + } catch (BadRequestException e) { + this.setCountryCode(null); + } } return this; diff --git a/opensilex-brapi/src/main/java/org/opensilex/brapi/model/BrAPIv1ObservationUnitDTO.java b/opensilex-brapi/src/main/java/org/opensilex/brapi/model/BrAPIv1ObservationUnitDTO.java index 009304be5..ef5ccbaaf 100644 --- a/opensilex-brapi/src/main/java/org/opensilex/brapi/model/BrAPIv1ObservationUnitDTO.java +++ b/opensilex-brapi/src/main/java/org/opensilex/brapi/model/BrAPIv1ObservationUnitDTO.java @@ -7,6 +7,7 @@ package org.opensilex.brapi.model; import com.fasterxml.jackson.annotation.JsonInclude; +import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Point; import org.locationtech.jts.io.geojson.GeoJsonReader; import org.opensilex.brapi.responses.BrAPIv1AccessionWarning; @@ -24,11 +25,13 @@ import org.opensilex.core.germplasm.dal.GermplasmModel; import org.opensilex.core.ontology.Oeso; import org.opensilex.core.organisation.dal.facility.FacilityDAO; +import org.opensilex.core.organisation.dal.facility.FacilityModel; import org.opensilex.core.scientificObject.dal.ScientificObjectModel; import org.opensilex.security.account.dal.AccountModel; import org.opensilex.sparql.model.SPARQLModelRelation; import org.opensilex.sparql.model.SPARQLResourceModel; import org.opensilex.sparql.ontology.dal.OntologyDAO; +import org.opensilex.sparql.service.SPARQLService; import org.opensilex.utils.ListWithPagination; import java.net.URI; @@ -315,7 +318,8 @@ public static BrAPIv1ObservationUnitDTO fromModel( OntologyDAO ontologyDAO, MoveEventDAO moveEventDAO, GeospatialDAO geospatialDAO, - GermplasmDAO germplasmDAO + GermplasmDAO germplasmDAO, + SPARQLService sparql ) throws Exception { BrAPIv1ObservationUnitDTO observationUnit = new BrAPIv1ObservationUnitDTO(); @@ -378,6 +382,7 @@ public static BrAPIv1ObservationUnitDTO fromModel( observationUnit.setPositionCoordinateYType(PositionType.LATITUDE); GeospatialModel objectGeometryModel = geospatialDAO.getGeometryByURI(model.getUri(), experimentModel.getUri()); + //if the Object has a geometry take its centroid coordinates as long/lat if (objectGeometryModel != null && objectGeometryModel.getGeometry() != null && !objectGeometryModel.getGeometry().toString().isEmpty()) { org.locationtech.jts.geom.Geometry objectJtsGeometry = new GeoJsonReader().read(objectGeometryModel.getGeometry().toJson()); @@ -387,35 +392,48 @@ public static BrAPIv1ObservationUnitDTO fromModel( observationUnit.setPositionCoordinateX(Double.toString(centroid.getX())); observationUnit.setPositionCoordinateY(Double.toString(centroid.getY())); } - } else if (moveEventDAO.countMoves(model.getUri()) == 1){ + } else if (moveEventDAO.countMoves(model.getUri()) >= 1){ MoveModel moveModel = moveEventDAO.getLastMoveEvent(model.getUri()); PositionModel movePosition = moveEventDAO.getPosition(model.getUri(), moveModel.getUri()); - - if (!movePosition.getCoordinates().toString().isEmpty()){ - org.locationtech.jts.geom.Geometry moveJtsGeometry = new GeoJsonReader().read(movePosition.getCoordinates().toJson()); - - if (!moveJtsGeometry.isEmpty()){ + if (Objects.nonNull(movePosition)){ + //if the Object has a move with a geometry take its centroid coordinates as long/lat + if (Objects.nonNull(movePosition.getCoordinates())) { + Geometry moveJtsGeometry = new GeoJsonReader().read(movePosition.getCoordinates().toJson()); Point centroid = moveJtsGeometry.getCentroid(); observationUnit.setPositionCoordinateX(Double.toString(centroid.getX())); observationUnit.setPositionCoordinateY(Double.toString(centroid.getY())); + } else if (Objects.nonNull(movePosition.getX()) || Objects.nonNull(movePosition.getY())) { + //if the Object has a move with a position take its X/Y coordinates as grid coordinates + if (Objects.nonNull(movePosition.getX())) { + observationUnit.setPositionCoordinateX(movePosition.getX()); + } + if (Objects.nonNull(movePosition.getY())) { + observationUnit.setPositionCoordinateY(movePosition.getY()); + } + observationUnit.setPositionCoordinateXType(PositionType.GRID_ROW); + observationUnit.setPositionCoordinateYType(PositionType.GRID_COL); } - } else if (!movePosition.getX().isEmpty() | movePosition.getY().isEmpty()) { - if (!movePosition.getX().isEmpty()) { - observationUnit.setPositionCoordinateX(movePosition.getX()); - } - if (!movePosition.getY().isEmpty()) { - observationUnit.setPositionCoordinateY(movePosition.getY()); + } else if (Objects.nonNull(moveModel.getTo())) { + //if the Object has a move with a destination facility take the centroid of that facility's geometry + FacilityModel destinationFacility = moveModel.getTo(); + GeospatialModel destinationFacilityGeometryModel = geospatialDAO.getGeometryByURI( + destinationFacility.getUri(), + sparql.getDefaultGraphURI(FacilityModel.class) + ); + Geometry facilityJtsGeometry = new GeoJsonReader().read(destinationFacilityGeometryModel.getGeometry().toJson()); + if (Objects.nonNull(facilityJtsGeometry)) { + Point centroid = facilityJtsGeometry.getCentroid(); + observationUnit.setPositionCoordinateX(Double.toString(centroid.getX())); + observationUnit.setPositionCoordinateY(Double.toString(centroid.getY())); } - observationUnit.setPositionCoordinateXType(PositionType.GRID_ROW); - observationUnit.setPositionCoordinateYType(PositionType.GRID_COL); } } observationUnit.setStudyName(experimentModel.getName()); observationUnit.setStudyDbId(experimentModel.getUri().toString()); - if (model.getFactorLevels().size()>0){ + if (Objects.nonNull(model.getFactorLevels()) && model.getFactorLevels().size()>0){ List unitTreatments = new ArrayList<>(); List experimentFactors = experimentModel.getFactors(); List objectFactorLevels = model.getFactorLevels().stream().map(SPARQLResourceModel::getUri).collect(Collectors.toList());