From 851659e90f20df59907bd520b152741b94d69e49 Mon Sep 17 00:00:00 2001 From: grantnert48 <tobias.grantner@tuwien.ac.at> Date: Thu, 17 Aug 2023 15:59:55 +0200 Subject: [PATCH] Removed merged services --- dbrepo-identifier-service/.dockerignore | 1 - dbrepo-identifier-service/.gitignore | 41 - .../.mvn/wrapper/MavenWrapperDownloader.java | 118 - .../.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - dbrepo-identifier-service/Dockerfile | 46 - dbrepo-identifier-service/README.md | 15 - dbrepo-identifier-service/api/pom.xml | 19 - .../main/java/at/tuwien/ExportResource.java | 18 - dbrepo-identifier-service/mvnw | 310 - dbrepo-identifier-service/mvnw.cmd | 182 - dbrepo-identifier-service/pom.xml | 282 - dbrepo-identifier-service/report/pom.xml | 51 - .../rest-service/pom.xml | 40 - .../DbrepoIdentifierServiceApplication.java | 25 - .../java/at/tuwien/config/SwaggerConfig.java | 54 - .../main/java/at/tuwien/config/WebConfig.java | 16 - .../converters/IdentifierTypeConverter.java | 12 - .../tuwien/endpoints/IdentifierEndpoint.java | 173 - .../tuwien/endpoints/PersistenceEndpoint.java | 241 - .../tuwien/handlers/ApiExceptionHandler.java | 150 - .../src/main/resources/application-doi.yml | 6 - .../src/main/resources/application-local.yml | 57 - .../src/main/resources/application.yml | 72 - .../src/main/resources/config.properties | 0 .../src/main/resources/templates/cite_apa.txt | 1 - .../main/resources/templates/cite_bibtex.txt | 7 - .../main/resources/templates/cite_ieee.txt | 1 - .../src/main/resources/templates/doi.xml | 50 - .../src/test/java/at/tuwien/BaseUnitTest.java | 9 - .../endpoint/ActuatorComponentTest.java | 65 - .../IdentifierEndpointIntegrationTest.java | 309 - .../endpoint/IdentifierEndpointUnitTest.java | 331 -- .../endpoint/PersistenceEndpointUnitTest.java | 672 --- .../tuwien/endpoint/SwaggerComponentTest.java | 38 - .../gateway/QueryServiceGatewayUnitTest.java | 171 - ...aCiteIdentifierServiceIntegrationTest.java | 120 - .../DataCiteIdentifierServiceUnitTest.java | 228 - .../DatabaseServiceIntegrationTest.java | 74 - .../IdentifierServiceIntegrationTest.java | 406 -- .../service/IdentifierServiceUnitTest.java | 420 -- .../service/MetadataServiceUnitTest.java | 171 - .../tuwien/service/UserServiceUnitTest.java | 61 - .../src/test/resources/application.properties | 28 - .../resources/bibliography/style_apa0.txt | 1 - .../resources/bibliography/style_apa1.txt | 1 - .../resources/bibliography/style_apa2.txt | 1 - .../resources/bibliography/style_apa3.txt | 1 - .../resources/bibliography/style_apa4.txt | 1 - .../resources/bibliography/style_bibtex0.txt | 7 - .../resources/bibliography/style_bibtex1.txt | 7 - .../resources/bibliography/style_bibtex2.txt | 7 - .../resources/bibliography/style_bibtex3.txt | 7 - .../resources/bibliography/style_ieee0.txt | 1 - .../resources/bibliography/style_ieee1.txt | 1 - .../resources/bibliography/style_ieee2.txt | 1 - .../resources/bibliography/style_ieee3.txt | 1 - .../src/test/resources/csv/keyboard.csv | 4969 ----------------- .../src/test/resources/csv/testdata.csv | 1001 ---- .../src/test/resources/doi_ec.json | 467 -- .../src/test/resources/init/schema.sql | 1 - .../src/test/resources/json/metadata0.json | 23 - .../src/test/resources/json/metadata1.json | 65 - .../src/test/resources/orcid_jdoe.json | 1277 ----- .../src/test/resources/ror_tuw.json | 121 - .../xml/datacite-example-dataset-v4.xml | 40 - .../src/test/resources/xml/metadata0.xml | 19 - .../src/test/resources/xml/metadata1.xml | 28 - dbrepo-identifier-service/rest-service/~ | 0 dbrepo-identifier-service/services/pom.xml | 50 - .../java/at/tuwien/auth/AuthTokenFilter.java | 100 - .../java/at/tuwien/config/DataCiteConfig.java | 24 - .../java/at/tuwien/config/EndpointConfig.java | 14 - .../java/at/tuwien/config/GatewayConfig.java | 38 - .../java/at/tuwien/config/JacksonConfig.java | 32 - .../at/tuwien/config/OpenSearchConfig.java | 61 - .../java/at/tuwien/config/TemplateConfig.java | 30 - .../at/tuwien/config/WebSecurityConfig.java | 96 - .../exception/AccessDeniedException.java | 23 - .../exception/DatabaseNotFoundException.java | 21 - .../exception/DoiNotFoundException.java | 21 - .../IdentifierAlreadyExistsException.java | 21 - .../IdentifierAlreadyPublishedException.java | 21 - .../IdentifierNotFoundException.java | 21 - ...entifierPublishingNotAllowedException.java | 21 - .../exception/IdentifierRequestException.java | 21 - .../IdentifierUpdateBadFormException.java | 21 - .../tuwien/exception/NotAllowedException.java | 21 - .../exception/OrcidNotFoundException.java | 21 - .../exception/QueryNotFoundException.java | 21 - .../exception/RemoteUnavailableException.java | 21 - .../exception/RorNotFoundException.java | 21 - .../exception/UserNotFoundException.java | 21 - .../exception/ViewNotFoundException.java | 21 - .../gateway/ApiTemplateInterceptor.java | 7 - .../at/tuwien/gateway/CrossrefGateway.java | 8 - .../java/at/tuwien/gateway/OrcidGateway.java | 11 - .../tuwien/gateway/QueryServiceGateway.java | 36 - .../java/at/tuwien/gateway/RorGateway.java | 9 - .../impl/ApiTemplateInterceptorImpl.java | 22 - .../gateway/impl/CrossrefGatewayImpl.java | 41 - .../tuwien/gateway/impl/OrcidGatewayImpl.java | 40 - .../gateway/impl/QueryServiceGatewayImpl.java | 84 - .../tuwien/gateway/impl/RorGatewayImpl.java | 43 - .../java/at/tuwien/mapper/DataCiteMapper.java | 125 - .../java/at/tuwien/mapper/DocumentMapper.java | 15 - .../java/at/tuwien/mapper/ExternalMapper.java | 76 - .../at/tuwien/mapper/IdentifierMapper.java | 87 - .../java/at/tuwien/mapper/UserMapper.java | 25 - .../repository/mdb/AccessRepository.java | 24 - .../repository/mdb/ContainerRepository.java | 9 - .../repository/mdb/CreatorRepository.java | 10 - .../repository/mdb/DatabaseRepository.java | 9 - .../mdb/IdentifierDescriptionRepository.java | 9 - .../repository/mdb/IdentifierRepository.java | 58 - .../mdb/IdentifierTitleRepository.java | 9 - .../repository/mdb/ImageRepository.java | 9 - .../repository/mdb/LicenseRepository.java | 9 - .../repository/mdb/RealmRepository.java | 12 - .../repository/mdb/TableRepository.java | 11 - .../tuwien/repository/mdb/UserRepository.java | 22 - .../tuwien/repository/mdb/ViewRepository.java | 11 - .../sdb/IdentifierIdxRepository.java | 9 - .../java/at/tuwien/service/AccessService.java | 19 - .../at/tuwien/service/DatabaseService.java | 16 - .../at/tuwien/service/IdentifierService.java | 122 - .../at/tuwien/service/MetadataService.java | 21 - .../java/at/tuwien/service/UserService.java | 16 - .../java/at/tuwien/service/ViewService.java | 8 - .../service/impl/AccessServiceImpl.java | 34 - .../impl/DataCiteIdentifierServiceImpl.java | 228 - .../service/impl/DatabaseServiceImpl.java | 36 - .../service/impl/IdentifierServiceImpl.java | 353 -- .../service/impl/MetadataServiceImpl.java | 67 - .../tuwien/service/impl/UserServiceImpl.java | 34 - .../tuwien/service/impl/ViewServiceImpl.java | 33 - .../tuwien/utils/EnumToStringConverter.java | 15 - dbrepo-identifier-service/~ | 0 dbrepo-metadata-db/pom.xml | 93 - dbrepo-semantics-service/.gitignore | 36 - .../.mvn/wrapper/MavenWrapperDownloader.java | 118 - .../.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - dbrepo-semantics-service/Dockerfile | 39 - dbrepo-semantics-service/README.md | 15 - dbrepo-semantics-service/mvnw | 310 - dbrepo-semantics-service/mvnw.cmd | 182 - dbrepo-semantics-service/pom.xml | 255 - dbrepo-semantics-service/report/pom.xml | 56 - dbrepo-semantics-service/rest-service/pom.xml | 44 - .../DbrepoSemanticsServiceApplication.java | 25 - .../java/at/tuwien/config/SwaggerConfig.java | 54 - .../at/tuwien/endpoints/OntologyEndpoint.java | 160 - .../at/tuwien/endpoints/QueryEndpoint.java | 103 - .../tuwien/endpoints/SemanticsEndpoint.java | 128 - .../at/tuwien/endpoints/TableEndpoint.java | 106 - .../tuwien/handlers/ApiExceptionHandler.java | 78 - .../src/main/resources/application-local.yml | 55 - .../src/main/resources/application.yml | 70 - .../src/main/resources/config.properties | 0 .../main/resources/mariadb_hibernate.cfg.xml | 20 - .../src/test/java/at/tuwien/BaseUnitTest.java | 9 - .../endpoint/ActuatorComponentTest.java | 68 - .../endpoint/OntologyEndpointUnitTest.java | 312 -- .../endpoint/QueryEndpointUnitTest.java | 167 - .../endpoint/SemanticsEndpointUnitTest.java | 215 - .../tuwien/endpoint/SwaggerComponentTest.java | 41 - .../endpoint/TableEndpointUnitTest.java | 140 - .../OntologyServiceIntegrationTest.java | 124 - .../service/QueryServiceIntegrationTest.java | 142 - .../service/SemanticServiceUnitTest.java | 146 - .../service/TableServiceIntegrationTest.java | 85 - .../tuwien/service/TableServiceUnitTest.java | 70 - .../src/test/resources/application.properties | 28 - .../src/test/resources/init/schema.sql | 1 - .../src/test/resources/species/Species.sql | 7 - .../src/test/resources/traffic/TrafficCh.sql | 0 .../src/test/resources/weather/WeatherAus.sql | 0 dbrepo-semantics-service/services/pom.xml | 42 - .../java/at/tuwien/auth/AuthTokenFilter.java | 100 - .../java/at/tuwien/config/GatewayConfig.java | 40 - .../java/at/tuwien/config/JacksonConfig.java | 30 - .../at/tuwien/config/OpenSearchConfig.java | 61 - .../at/tuwien/config/WebSecurityConfig.java | 96 - .../exception/FilterBadRequestException.java | 21 - .../exception/OntologyNotFoundException.java | 21 - .../exception/QueryMalformedException.java | 21 - .../TableColumnNotFoundException.java | 21 - .../exception/TableNotFoundException.java | 21 - .../exception/UriMalformedException.java | 21 - .../exception/UserNotFoundException.java | 21 - .../java/at/tuwien/mapper/OntologyMapper.java | 119 - .../java/at/tuwien/mapper/SemanticMapper.java | 18 - .../java/at/tuwien/mapper/TableMapper.java | 25 - .../repository/mdb/ContainerRepository.java | 10 - .../repository/mdb/DatabaseRepository.java | 10 - .../repository/mdb/ImageRepository.java | 10 - .../repository/mdb/OntologyRepository.java | 10 - .../repository/mdb/RealmRepository.java | 12 - .../mdb/TableColumnConceptRepository.java | 10 - .../repository/mdb/TableColumnRepository.java | 10 - .../mdb/TableColumnUnitRepository.java | 10 - .../repository/mdb/TableRepository.java | 14 - .../tuwien/repository/mdb/UserRepository.java | 15 - .../repository/sdb/ConceptIdxRepository.java | 9 - .../repository/sdb/UnitIdxRepository.java | 9 - .../at/tuwien/service/OntologyService.java | 22 - .../java/at/tuwien/service/QueryService.java | 16 - .../at/tuwien/service/SemanticService.java | 18 - .../java/at/tuwien/service/TableService.java | 20 - .../java/at/tuwien/service/UserService.java | 8 - .../service/impl/OntologyServiceImpl.java | 82 - .../tuwien/service/impl/QueryServiceImpl.java | 91 - .../service/impl/SemanticServiceImpl.java | 79 - .../tuwien/service/impl/TableServiceImpl.java | 94 - .../tuwien/service/impl/UserServiceImpl.java | 34 - dbrepo-user-service/.gitignore | 44 - dbrepo-user-service/Dockerfile | 41 - dbrepo-user-service/README.md | 15 - dbrepo-user-service/pom.xml | 299 - dbrepo-user-service/report/pom.xml | 56 - dbrepo-user-service/rest-service/pom.xml | 46 - .../at/tuwien/FdaUserServiceApplication.java | 27 - .../java/at/tuwien/config/SwaggerConfig.java | 46 - .../tuwien/endpoint/MaintenanceEndpoint.java | 163 - .../java/at/tuwien/endpoint/UserEndpoint.java | 278 - .../tuwien/handlers/ApiExceptionHandler.java | 127 - .../src/main/resources/application-local.yml | 54 - .../src/main/resources/application.yml | 69 - .../src/main/resources/config.properties | 0 .../main/resources/mariadb_hibernate.cfg.xml | 20 - .../src/test/java/at/tuwien/BaseUnitTest.java | 9 - .../endpoint/ActuatorComponentTest.java | 62 - .../endpoint/MaintenanceEndpointUnitTest.java | 352 -- .../tuwien/endpoint/SwaggerComponentTest.java | 42 - .../tuwien/endpoint/UserEndpointUnitTest.java | 444 -- .../java/at/tuwien/mapper/UserMapperTest.java | 45 - .../BannerMessageServiceIntegrationTest.java | 143 - .../service/RealmServiceIntegrationTest.java | 62 - .../service/RoleServiceIntegrationTest.java | 66 - .../UserAttributeServiceIntegrationTest.java | 102 - .../service/UserServiceIntegrationTest.java | 247 - .../src/test/resources/application.properties | 30 - .../src/test/resources/init/schema.sql | 1 - dbrepo-user-service/services/pom.xml | 16 - .../java/at/tuwien/auth/AuthTokenFilter.java | 100 - .../java/at/tuwien/config/GatewayConfig.java | 49 - .../java/at/tuwien/config/JacksonConfig.java | 30 - .../at/tuwien/config/OpenSearchConfig.java | 61 - .../at/tuwien/config/WebSecurityConfig.java | 96 - .../BannerMessageNotFoundException.java | 20 - .../exception/ForeignUserException.java | 21 - .../tuwien/exception/NotAllowedException.java | 21 - .../exception/RealmNotFoundException.java | 21 - .../exception/RemoteUnavailableException.java | 21 - .../exception/RoleNotFoundException.java | 21 - .../exception/UserAlreadyExistsException.java | 21 - .../UserAttributeNotFoundException.java | 21 - .../UserEmailAlreadyExistsException.java | 21 - .../exception/UserNotFoundException.java | 21 - .../tuwien/mapper/AuthenticationMapper.java | 19 - .../at/tuwien/mapper/BannerMessageMapper.java | 24 - .../java/at/tuwien/mapper/UserMapper.java | 58 - .../mdb/BannerMessageRepository.java | 14 - .../repository/mdb/CredentialRepository.java | 12 - .../mdb/GroupMembershipRepository.java | 10 - .../repository/mdb/GroupRepository.java | 14 - .../repository/mdb/RealmRepository.java | 15 - .../repository/mdb/RoleMappingRepository.java | 11 - .../tuwien/repository/mdb/RoleRepository.java | 16 - .../mdb/UserAttributeRepository.java | 15 - .../tuwien/repository/mdb/UserRepository.java | 17 - .../repository/sdb/UserIdxRepository.java | 11 - .../tuwien/service/BannerMessageService.java | 60 - .../java/at/tuwien/service/RealmService.java | 16 - .../java/at/tuwien/service/RoleService.java | 8 - .../tuwien/service/UserAttributeService.java | 15 - .../java/at/tuwien/service/UserService.java | 91 - .../impl/BannerMessageServiceImpl.java | 78 - .../tuwien/service/impl/RealmServiceImpl.java | 35 - .../tuwien/service/impl/RoleServiceImpl.java | 36 - .../impl/UserAttributeServiceImpl.java | 46 - .../tuwien/service/impl/UserServiceImpl.java | 239 - .../src/test/resources/application.properties | 14 - 284 files changed, 24866 deletions(-) delete mode 100644 dbrepo-identifier-service/.dockerignore delete mode 100644 dbrepo-identifier-service/.gitignore delete mode 100644 dbrepo-identifier-service/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 dbrepo-identifier-service/.mvn/wrapper/maven-wrapper.jar delete mode 100644 dbrepo-identifier-service/.mvn/wrapper/maven-wrapper.properties delete mode 100644 dbrepo-identifier-service/Dockerfile delete mode 100644 dbrepo-identifier-service/README.md delete mode 100644 dbrepo-identifier-service/api/pom.xml delete mode 100644 dbrepo-identifier-service/api/src/main/java/at/tuwien/ExportResource.java delete mode 100755 dbrepo-identifier-service/mvnw delete mode 100644 dbrepo-identifier-service/mvnw.cmd delete mode 100644 dbrepo-identifier-service/pom.xml delete mode 100644 dbrepo-identifier-service/report/pom.xml delete mode 100644 dbrepo-identifier-service/rest-service/pom.xml delete mode 100644 dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/DbrepoIdentifierServiceApplication.java delete mode 100644 dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/config/SwaggerConfig.java delete mode 100644 dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/config/WebConfig.java delete mode 100644 dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/converters/IdentifierTypeConverter.java delete mode 100644 dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java delete mode 100644 dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/PersistenceEndpoint.java delete mode 100644 dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java delete mode 100644 dbrepo-identifier-service/rest-service/src/main/resources/application-doi.yml delete mode 100644 dbrepo-identifier-service/rest-service/src/main/resources/application-local.yml delete mode 100644 dbrepo-identifier-service/rest-service/src/main/resources/application.yml delete mode 100644 dbrepo-identifier-service/rest-service/src/main/resources/config.properties delete mode 100644 dbrepo-identifier-service/rest-service/src/main/resources/templates/cite_apa.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/main/resources/templates/cite_bibtex.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/main/resources/templates/cite_ieee.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/main/resources/templates/doi.xml delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/ActuatorComponentTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointIntegrationTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointUnitTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/PersistenceEndpointUnitTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/SwaggerComponentTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/gateway/QueryServiceGatewayUnitTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceIntegrationTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceUnitTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/MetadataServiceUnitTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/UserServiceUnitTest.java delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/application.properties delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa0.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa1.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa2.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa3.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa4.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex0.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex1.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex2.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex3.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee0.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee1.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee2.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee3.txt delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/csv/keyboard.csv delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/csv/testdata.csv delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/doi_ec.json delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/init/schema.sql delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/json/metadata0.json delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/json/metadata1.json delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/orcid_jdoe.json delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/ror_tuw.json delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/xml/datacite-example-dataset-v4.xml delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/xml/metadata0.xml delete mode 100644 dbrepo-identifier-service/rest-service/src/test/resources/xml/metadata1.xml delete mode 100644 dbrepo-identifier-service/rest-service/~ delete mode 100644 dbrepo-identifier-service/services/pom.xml delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/auth/AuthTokenFilter.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/config/DataCiteConfig.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/config/EndpointConfig.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/config/GatewayConfig.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/config/JacksonConfig.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/config/OpenSearchConfig.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/config/TemplateConfig.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/AccessDeniedException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/DatabaseNotFoundException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/DoiNotFoundException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierAlreadyExistsException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierAlreadyPublishedException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierNotFoundException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierPublishingNotAllowedException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierRequestException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierUpdateBadFormException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/NotAllowedException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/OrcidNotFoundException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/QueryNotFoundException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/RemoteUnavailableException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/RorNotFoundException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/UserNotFoundException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/ViewNotFoundException.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/ApiTemplateInterceptor.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/CrossrefGateway.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/OrcidGateway.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/QueryServiceGateway.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/RorGateway.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/ApiTemplateInterceptorImpl.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/CrossrefGatewayImpl.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/OrcidGatewayImpl.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/QueryServiceGatewayImpl.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/RorGatewayImpl.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/DataCiteMapper.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/DocumentMapper.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/ExternalMapper.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/IdentifierMapper.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/UserMapper.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/AccessRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/ContainerRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/CreatorRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/DatabaseRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/IdentifierDescriptionRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/IdentifierRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/IdentifierTitleRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/ImageRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/LicenseRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/RealmRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/TableRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/UserRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/ViewRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/sdb/IdentifierIdxRepository.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/AccessService.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/DatabaseService.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/IdentifierService.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/MetadataService.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/UserService.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/ViewService.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/DataCiteIdentifierServiceImpl.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/MetadataServiceImpl.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java delete mode 100644 dbrepo-identifier-service/services/src/main/java/at/tuwien/utils/EnumToStringConverter.java delete mode 100644 dbrepo-identifier-service/~ delete mode 100644 dbrepo-metadata-db/pom.xml delete mode 100644 dbrepo-semantics-service/.gitignore delete mode 100644 dbrepo-semantics-service/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 dbrepo-semantics-service/.mvn/wrapper/maven-wrapper.jar delete mode 100644 dbrepo-semantics-service/.mvn/wrapper/maven-wrapper.properties delete mode 100644 dbrepo-semantics-service/Dockerfile delete mode 100644 dbrepo-semantics-service/README.md delete mode 100755 dbrepo-semantics-service/mvnw delete mode 100644 dbrepo-semantics-service/mvnw.cmd delete mode 100644 dbrepo-semantics-service/pom.xml delete mode 100644 dbrepo-semantics-service/report/pom.xml delete mode 100644 dbrepo-semantics-service/rest-service/pom.xml delete mode 100644 dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/DbrepoSemanticsServiceApplication.java delete mode 100644 dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/config/SwaggerConfig.java delete mode 100644 dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/OntologyEndpoint.java delete mode 100644 dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/QueryEndpoint.java delete mode 100644 dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/SemanticsEndpoint.java delete mode 100644 dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java delete mode 100644 dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java delete mode 100644 dbrepo-semantics-service/rest-service/src/main/resources/application-local.yml delete mode 100644 dbrepo-semantics-service/rest-service/src/main/resources/application.yml delete mode 100644 dbrepo-semantics-service/rest-service/src/main/resources/config.properties delete mode 100644 dbrepo-semantics-service/rest-service/src/main/resources/mariadb_hibernate.cfg.xml delete mode 100644 dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java delete mode 100644 dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/ActuatorComponentTest.java delete mode 100644 dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/OntologyEndpointUnitTest.java delete mode 100644 dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/QueryEndpointUnitTest.java delete mode 100644 dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/SemanticsEndpointUnitTest.java delete mode 100644 dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/SwaggerComponentTest.java delete mode 100644 dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java delete mode 100644 dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/OntologyServiceIntegrationTest.java delete mode 100644 dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/QueryServiceIntegrationTest.java delete mode 100644 dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/SemanticServiceUnitTest.java delete mode 100644 dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java delete mode 100644 dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java delete mode 100644 dbrepo-semantics-service/rest-service/src/test/resources/application.properties delete mode 100644 dbrepo-semantics-service/rest-service/src/test/resources/init/schema.sql delete mode 100644 dbrepo-semantics-service/rest-service/src/test/resources/species/Species.sql delete mode 100644 dbrepo-semantics-service/rest-service/src/test/resources/traffic/TrafficCh.sql delete mode 100644 dbrepo-semantics-service/rest-service/src/test/resources/weather/WeatherAus.sql delete mode 100644 dbrepo-semantics-service/services/pom.xml delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/auth/AuthTokenFilter.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/config/GatewayConfig.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/config/JacksonConfig.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/config/OpenSearchConfig.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/FilterBadRequestException.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/OntologyNotFoundException.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/QueryMalformedException.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/TableColumnNotFoundException.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/TableNotFoundException.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/UriMalformedException.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/UserNotFoundException.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/mapper/OntologyMapper.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/mapper/SemanticMapper.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/mapper/TableMapper.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/ContainerRepository.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/DatabaseRepository.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/ImageRepository.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/OntologyRepository.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/RealmRepository.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableColumnConceptRepository.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableColumnRepository.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableColumnUnitRepository.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableRepository.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/UserRepository.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/sdb/ConceptIdxRepository.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/sdb/UnitIdxRepository.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/service/OntologyService.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/service/QueryService.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/service/SemanticService.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/service/TableService.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/service/UserService.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/OntologyServiceImpl.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/QueryServiceImpl.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/SemanticServiceImpl.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java delete mode 100644 dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java delete mode 100644 dbrepo-user-service/.gitignore delete mode 100644 dbrepo-user-service/Dockerfile delete mode 100644 dbrepo-user-service/README.md delete mode 100644 dbrepo-user-service/pom.xml delete mode 100644 dbrepo-user-service/report/pom.xml delete mode 100644 dbrepo-user-service/rest-service/pom.xml delete mode 100644 dbrepo-user-service/rest-service/src/main/java/at/tuwien/FdaUserServiceApplication.java delete mode 100644 dbrepo-user-service/rest-service/src/main/java/at/tuwien/config/SwaggerConfig.java delete mode 100644 dbrepo-user-service/rest-service/src/main/java/at/tuwien/endpoint/MaintenanceEndpoint.java delete mode 100644 dbrepo-user-service/rest-service/src/main/java/at/tuwien/endpoint/UserEndpoint.java delete mode 100644 dbrepo-user-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java delete mode 100644 dbrepo-user-service/rest-service/src/main/resources/application-local.yml delete mode 100644 dbrepo-user-service/rest-service/src/main/resources/application.yml delete mode 100644 dbrepo-user-service/rest-service/src/main/resources/config.properties delete mode 100644 dbrepo-user-service/rest-service/src/main/resources/mariadb_hibernate.cfg.xml delete mode 100644 dbrepo-user-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java delete mode 100644 dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/ActuatorComponentTest.java delete mode 100644 dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/MaintenanceEndpointUnitTest.java delete mode 100644 dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/SwaggerComponentTest.java delete mode 100644 dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/UserEndpointUnitTest.java delete mode 100644 dbrepo-user-service/rest-service/src/test/java/at/tuwien/mapper/UserMapperTest.java delete mode 100644 dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/BannerMessageServiceIntegrationTest.java delete mode 100644 dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/RealmServiceIntegrationTest.java delete mode 100644 dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/RoleServiceIntegrationTest.java delete mode 100644 dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/UserAttributeServiceIntegrationTest.java delete mode 100644 dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java delete mode 100644 dbrepo-user-service/rest-service/src/test/resources/application.properties delete mode 100644 dbrepo-user-service/rest-service/src/test/resources/init/schema.sql delete mode 100644 dbrepo-user-service/services/pom.xml delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/auth/AuthTokenFilter.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/config/GatewayConfig.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/config/JacksonConfig.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/config/OpenSearchConfig.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/exception/BannerMessageNotFoundException.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/exception/ForeignUserException.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/exception/NotAllowedException.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/exception/RealmNotFoundException.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/exception/RemoteUnavailableException.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/exception/RoleNotFoundException.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserAlreadyExistsException.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserAttributeNotFoundException.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserEmailAlreadyExistsException.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserNotFoundException.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/mapper/AuthenticationMapper.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/mapper/BannerMessageMapper.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/mapper/UserMapper.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/BannerMessageRepository.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/CredentialRepository.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/GroupMembershipRepository.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/GroupRepository.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/RealmRepository.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/RoleMappingRepository.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/RoleRepository.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/UserAttributeRepository.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/UserRepository.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/repository/sdb/UserIdxRepository.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/service/BannerMessageService.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/service/RealmService.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/service/RoleService.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/service/UserAttributeService.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/service/UserService.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/BannerMessageServiceImpl.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/RealmServiceImpl.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/RoleServiceImpl.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserAttributeServiceImpl.java delete mode 100644 dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java delete mode 100644 dbrepo-user-service/services/src/test/resources/application.properties diff --git a/dbrepo-identifier-service/.dockerignore b/dbrepo-identifier-service/.dockerignore deleted file mode 100644 index 3699812198..0000000000 --- a/dbrepo-identifier-service/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -**/*.csv \ No newline at end of file diff --git a/dbrepo-identifier-service/.gitignore b/dbrepo-identifier-service/.gitignore deleted file mode 100644 index 648659eaf4..0000000000 --- a/dbrepo-identifier-service/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### Environment ### -.env - -### Generated ### -ready -mapping.xml -rest-service/src/main/java/at/tuwien/userdb/Table.java - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/dbrepo-identifier-service/.mvn/wrapper/MavenWrapperDownloader.java b/dbrepo-identifier-service/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index a45eb6ba26..0000000000 --- a/dbrepo-identifier-service/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if (mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if (mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if (!outputFile.getParentFile().exists()) { - if (!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/dbrepo-identifier-service/.mvn/wrapper/maven-wrapper.jar b/dbrepo-identifier-service/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 diff --git a/dbrepo-identifier-service/.mvn/wrapper/maven-wrapper.properties b/dbrepo-identifier-service/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 642d572ce9..0000000000 --- a/dbrepo-identifier-service/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/dbrepo-identifier-service/Dockerfile b/dbrepo-identifier-service/Dockerfile deleted file mode 100644 index bc20b4874a..0000000000 --- a/dbrepo-identifier-service/Dockerfile +++ /dev/null @@ -1,46 +0,0 @@ -###### FIRST STAGE ###### -FROM dbrepo-metadata-db:latest as dependency -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -###### SECOND STAGE ###### -FROM maven:3-openjdk-17 as build -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -COPY ./pom.xml ./ - -RUN mvn -fn -B dependency:go-offline > /dev/null - -COPY --from=dependency /root/.m2/repository/at/tuwien /root/.m2/repository/at/tuwien - -COPY ./api ./api -COPY ./rest-service ./rest-service -COPY ./services ./services -COPY ./report ./report - -# Make sure it compiles -RUN mvn -q clean package -DskipTests - -###### THIRD STAGE ###### -FROM openjdk:17-alpine as runtime -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -ENV METADATA_DB=fda -ENV METADATA_USERNAME=root -ENV METADATA_PASSWORD=dbrepo -ENV BROKER_USERNAME=fda -ENV BROKER_PASSWORD=fda -ENV GATEWAY_ENDPOINT=http://gateway-service -ENV WEBSITE=http://localhost -ENV LOG_LEVEL=debug -ENV CLIENT_ID="dbrepo-client" -ENV DBREPO_CLIENT_SECRET="MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG" -ENV JWT_ISSUER="http://localhost/realms/dbrepo" -ENV JWT_PUBKEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB" - -WORKDIR /app - -COPY --from=build ./rest-service/target/rest-service-*.jar ./identifier-service.jar - -EXPOSE 9096 - -ENTRYPOINT ["java", "-Dlog4j2.formatMsgNoLookups=true", "-jar", "./identifier-service.jar"] diff --git a/dbrepo-identifier-service/README.md b/dbrepo-identifier-service/README.md deleted file mode 100644 index 9f9b6fcdd3..0000000000 --- a/dbrepo-identifier-service/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Identifier Service - -## Actuator - -- Actuator Info: http://localhost:9096/actuator/info -- Actuator Health: http://localhost:9096/actuator/health -- Actuator Prometheus: http://localhost:9096/actuator/prometheus - -## Swagger UI Endpoints - -- Swagger UI: http://localhost:9096/swagger-ui/index.html - -## OpenAPI Endpoints - -- OpenAPI v3 as .yaml: http://localhost:9096/v3/api-docs.yaml \ No newline at end of file diff --git a/dbrepo-identifier-service/api/pom.xml b/dbrepo-identifier-service/api/pom.xml deleted file mode 100644 index 01a432603d..0000000000 --- a/dbrepo-identifier-service/api/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <artifactId>dbrepo-identifier-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.3.0</version> - </parent> - - <artifactId>api</artifactId> - <name>dbrepo-identifier-service-api</name> - - <properties> - <jacoco.version>0.8.7</jacoco.version> - </properties> - -</project> \ No newline at end of file diff --git a/dbrepo-identifier-service/api/src/main/java/at/tuwien/ExportResource.java b/dbrepo-identifier-service/api/src/main/java/at/tuwien/ExportResource.java deleted file mode 100644 index f037fcf89a..0000000000 --- a/dbrepo-identifier-service/api/src/main/java/at/tuwien/ExportResource.java +++ /dev/null @@ -1,18 +0,0 @@ -package at.tuwien; - -import lombok.*; -import org.springframework.core.io.InputStreamResource; - -@Getter -@Setter -@ToString -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class ExportResource { - - private InputStreamResource resource; - - private String filename; - -} diff --git a/dbrepo-identifier-service/mvnw b/dbrepo-identifier-service/mvnw deleted file mode 100755 index a16b5431b4..0000000000 --- a/dbrepo-identifier-service/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/dbrepo-identifier-service/mvnw.cmd b/dbrepo-identifier-service/mvnw.cmd deleted file mode 100644 index c8d43372c9..0000000000 --- a/dbrepo-identifier-service/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM https://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/dbrepo-identifier-service/pom.xml b/dbrepo-identifier-service/pom.xml deleted file mode 100644 index e03d06db1b..0000000000 --- a/dbrepo-identifier-service/pom.xml +++ /dev/null @@ -1,282 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-parent</artifactId> - <version>3.0.6</version> - </parent> - - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-identifier-service</artifactId> - <version>1.3.0</version> - <name>dbrepo-identifier-service</name> - <description>Service that manages the identifiers</description> - - <packaging>pom</packaging> - <modules> - <module>api</module> - <module>rest-service</module> - <module>services</module> - <module>report</module> - </modules> - - <properties> - <java.version>17</java.version> - <spring-cloud.version>4.0.2</spring-cloud.version> - <mapstruct.version>1.5.5.Final</mapstruct.version> - <jacoco.version>0.8.10</jacoco.version> - <jwt.version>4.3.0</jwt.version> - <hibernate-c3po.version>5.6.3.Final</hibernate-c3po.version> - <commons-io.version>2.11.0</commons-io.version> - <opencsv.version>5.7.1</opencsv.version> - <super-csv.version>2.4.0</super-csv.version> - <jsql.version>4.6</jsql.version> - <springdoc-openapi.version>2.1.0</springdoc-openapi.version> - <hsqldb.version>2.7.2</hsqldb.version> - <testcontainers.version>1.18.3</testcontainers.version> - <opensearch-testcontainer.version>2.0.0</opensearch-testcontainer.version> - <opensearch-client.version>1.1.0</opensearch-client.version> - <opensearch-rest-client.version>2.8.0</opensearch-rest-client.version> - <jackson.version>2.15.2</jackson.version> - </properties> - - <dependencies> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> - <dependency><!-- https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#validation-starter-no-longer-included-in-web-starters --> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-validation</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-bootstrap</artifactId> - <version>${spring-cloud.version}</version> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-security</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-thymeleaf</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.security</groupId> - <artifactId>spring-security-test</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-actuator</artifactId> - </dependency> - <!-- Authentication --> - <dependency> - <groupId>com.auth0</groupId> - <artifactId>java-jwt</artifactId> - <version>${jwt.version}</version> - </dependency> - <!-- Monitoring --> - <dependency> - <groupId>io.micrometer</groupId> - <artifactId>micrometer-registry-prometheus</artifactId> - <scope>runtime</scope> - </dependency> - <!-- Entities and API --> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-db-entites</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-db-api</artifactId> - <version>${project.version}</version> - </dependency> - <!-- DataSource --> - <dependency> - <groupId>org.mariadb.jdbc</groupId> - <artifactId>mariadb-java-client</artifactId> - <version>${mariadb.version}</version> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>spring-data-opensearch</artifactId> - <version>${opensearch-client.version}</version> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>spring-data-opensearch-starter</artifactId> - <version>${opensearch-client.version}</version> - </dependency> - <!-- OpenSearch --> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-core</artifactId> - <version>${jackson.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> - <version>${jackson.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-annotations</artifactId> - <version>${jackson.version}</version> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>opensearch-rest-high-level-client</artifactId> - <version>${opensearch-rest-client.version}</version> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>opensearch-rest-client-sniffer</artifactId> - <version>${opensearch-rest-client.version}</version> - </dependency> - <!-- Swagger --> - <dependency> - <groupId>org.springdoc</groupId> - <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> - <version>${springdoc-openapi.version}</version> - </dependency> - <!-- Open API --> - <dependency> - <groupId>org.springdoc</groupId> - <artifactId>springdoc-openapi-starter-webmvc-api</artifactId> - <version>${springdoc-openapi.version}</version> - </dependency> - <!-- Testing --> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>spring-data-opensearch-test-autoconfigure</artifactId> - <version>${opensearch-client.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-jpa</artifactId> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-test</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - <exclusions> - <exclusion> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-vintage-engine</artifactId> - </exclusion> - <exclusion> - <groupId>org.junit.vintage</groupId> - <artifactId>junit-vintage-engine</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>com.h2database</groupId> - <artifactId>h2</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.testcontainers</groupId> - <artifactId>junit-jupiter</artifactId> - <version>${testcontainers.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.opensearch</groupId> - <artifactId>opensearch-testcontainers</artifactId> - <version>${opensearch-testcontainer.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-db-test</artifactId> - <version>${project.version}</version> - </dependency> - <!-- Export --> - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>${commons-io.version}</version> - </dependency> - <!-- IDE --> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - <!-- Mapping --> - <dependency> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct-processor</artifactId> - <version>${mapstruct.version}</version> - <optional>true</optional><!-- IntelliJ --> - </dependency> - <dependency> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct</artifactId> - <version>${mapstruct.version}</version> - </dependency> - </dependencies> - - <build> - <resources> - <resource> - <directory>${basedir}/src/main/resources</directory> - <filtering>true</filtering> - <includes> - <include>**/application*.yml</include> - <include>**/templates/*.xml</include> - <include>**/templates/*.txt</include> - </includes> - </resource> - </resources> - <plugins> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - <configuration> - <excludes> - <exclude>at/tuwien/config/**/*</exclude> - <exclude>at/tuwien/mapper/**/*</exclude> - <exclude>at/tuwien/exception/**/*</exclude> - <exclude>at/tuwien/utils/**/*</exclude> - <exclude>at/tuwien/handlers/**/*</exclude> - <exclude>at/tuwien/auth/**/*</exclude> - <exclude>**/DbrepoIdentifierServiceApplication.class</exclude> - </excludes> - </configuration> - <executions> - <execution> - <id>default-prepare-agent</id> - <goals> - <goal>prepare-agent</goal> - </goals> - </execution> - <execution> - <id>default-report</id> - <phase>verify</phase> - <goals> - <goal>report</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> diff --git a/dbrepo-identifier-service/report/pom.xml b/dbrepo-identifier-service/report/pom.xml deleted file mode 100644 index 3fafe6f604..0000000000 --- a/dbrepo-identifier-service/report/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <artifactId>dbrepo-identifier-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.3.0</version> - </parent> - - <artifactId>report</artifactId> - <name>dbrepo-identifier-service-report</name> - - <properties> - <jacoco.version>0.8.7</jacoco.version> - </properties> - - <dependencies> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>rest-service</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>services</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - <executions> - <execution> - <id>report-aggregate</id> - <phase>verify</phase> - <goals> - <goal>report-aggregate</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/pom.xml b/dbrepo-identifier-service/rest-service/pom.xml deleted file mode 100644 index 89ed56a1ca..0000000000 --- a/dbrepo-identifier-service/rest-service/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <artifactId>dbrepo-identifier-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.3.0</version> - </parent> - - <artifactId>rest-service</artifactId> - <version>1.3.0</version> - <name>dbrepo-identifier-service-rest</name> - - <dependencies> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>services</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>repackage</goal><!-- to make it exuteable with $ java -jar ./app.jar --> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/DbrepoIdentifierServiceApplication.java b/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/DbrepoIdentifierServiceApplication.java deleted file mode 100644 index 6470353fa5..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/DbrepoIdentifierServiceApplication.java +++ /dev/null @@ -1,25 +0,0 @@ -package at.tuwien; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration; -import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@EnableJpaAuditing -@EnableTransactionManagement -@EntityScan(basePackages = {"at.tuwien.entities"}) -@EnableElasticsearchRepositories(basePackages = {"at.tuwien.repository.sdb"}) -@EnableJpaRepositories(basePackages = {"at.tuwien.repository.mdb"}) -@SpringBootApplication(exclude = {ElasticsearchDataAutoConfiguration.class, ElasticsearchRestClientAutoConfiguration.class}) -public class DbrepoIdentifierServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(DbrepoIdentifierServiceApplication.class, args); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/config/SwaggerConfig.java b/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/config/SwaggerConfig.java deleted file mode 100644 index 7c8ddcff28..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/config/SwaggerConfig.java +++ /dev/null @@ -1,54 +0,0 @@ -package at.tuwien.config; - -import io.swagger.v3.oas.models.ExternalDocumentation; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.servers.Server; -import org.springdoc.core.models.GroupedOpenApi; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -@Configuration -public class SwaggerConfig { - - @Value("${app.version:unknown}") - private String version; - - @Bean - public OpenAPI springShopOpenAPI() { - return new OpenAPI() - .info(new Info() - .title("Database Repository Identifier Service API") - .contact(new Contact() - .name("Prof. Andreas Rauber") - .email("andreas.rauber@tuwien.ac.at")) - .description("Service that manages the identifiers") - .version(version) - .license(new License() - .name("Apache 2.0") - .url("https://www.apache.org/licenses/LICENSE-2.0"))) - .externalDocs(new ExternalDocumentation() - .description("Sourcecode Documentation") - .url("https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services")) - .servers(List.of(new Server() - .description("Generated server url") - .url("http://localhost:9096"), - new Server() - .description("Sandbox") - .url("https://dbrepo2.tuwien.ac.at"))); - } - - @Bean - public GroupedOpenApi publicApi() { - return GroupedOpenApi.builder() - .group("identifier-service") - .pathsToMatch("/api/**") - .build(); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/config/WebConfig.java b/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/config/WebConfig.java deleted file mode 100644 index 9b8509553e..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/config/WebConfig.java +++ /dev/null @@ -1,16 +0,0 @@ -package at.tuwien.config; - -import at.tuwien.converters.IdentifierTypeConverter; -import org.springframework.context.annotation.Configuration; -import org.springframework.format.FormatterRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class WebConfig implements WebMvcConfigurer { - - @Override - public void addFormatters(FormatterRegistry registry) { - registry.addConverter(new IdentifierTypeConverter()); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/converters/IdentifierTypeConverter.java b/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/converters/IdentifierTypeConverter.java deleted file mode 100644 index 9635687470..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/converters/IdentifierTypeConverter.java +++ /dev/null @@ -1,12 +0,0 @@ -package at.tuwien.converters; - -import at.tuwien.api.identifier.IdentifierTypeDto; -import org.springframework.core.convert.converter.Converter; - -public class IdentifierTypeConverter implements Converter<String, IdentifierTypeDto> { - - @Override - public IdentifierTypeDto convert(String source) { - return IdentifierTypeDto.valueOf(source.toUpperCase()); - } -} diff --git a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java b/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java deleted file mode 100644 index a51a3c784a..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java +++ /dev/null @@ -1,173 +0,0 @@ -package at.tuwien.endpoints; - -import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.identifier.IdentifierSaveDto; -import at.tuwien.api.identifier.IdentifierTypeDto; -import at.tuwien.api.user.external.ExternalMetadataDto; -import at.tuwien.entities.identifier.Identifier; -import at.tuwien.entities.user.User; -import at.tuwien.exception.*; -import at.tuwien.mapper.IdentifierMapper; -import at.tuwien.service.AccessService; -import at.tuwien.service.IdentifierService; -import at.tuwien.service.MetadataService; -import at.tuwien.service.UserService; -import io.micrometer.core.annotation.Timed; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; - -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; - -import java.security.Principal; -import java.util.List; -import java.util.stream.Collectors; - -@Log4j2 -@CrossOrigin(origins = "*") -@RestController -@RequestMapping("/api/identifier") -public class IdentifierEndpoint { - - private final UserService userService; - private final AccessService accessService; - private final MetadataService metadataService; - private final IdentifierMapper identifierMapper; - private final IdentifierService identifierService; - - @Autowired - public IdentifierEndpoint(UserService userService, AccessService accessService, MetadataService metadataService, - IdentifierMapper identifierMapper, IdentifierService identifierService) { - this.userService = userService; - this.accessService = accessService; - this.metadataService = metadataService; - this.identifierMapper = identifierMapper; - this.identifierService = identifierService; - } - - @GetMapping - @Transactional(readOnly = true) - @Timed(value = "identifier.list", description = "Time needed to list the identifiers") - @Operation(summary = "Find identifiers") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "List identifiers", - content = {@Content( - mediaType = "application/json", - array = @ArraySchema(schema = @Schema(implementation = IdentifierDto.class)))}), - }) - public ResponseEntity<List<IdentifierDto>> list(@RequestParam(required = false) Long dbid, - @RequestParam(required = false) Long qid, - @RequestParam(required = false) Long vid, - @RequestParam(required = false) IdentifierTypeDto type) { - log.debug("endpoint find identifiers, dbid={}, qid={}, vid={}, type={}", dbid, qid, vid, type); - final List<IdentifierDto> dto = identifierService.findAll(type, dbid, qid, vid) - .stream() - .map(identifierMapper::identifierToIdentifierDto) - .collect(Collectors.toList()); - log.info("Find identifiers resulted in {} identifiers", dto.size()); - return ResponseEntity.ok(dto); - } - - @PostMapping - @Transactional - @Timed(value = "identifier.create", description = "Time needed to create an identifier") - @PreAuthorize("hasAuthority('create-identifier') or hasAuthority('create-foreign-identifier')") - @Operation(summary = "Create identifier", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "201", - description = "Created identifier", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = IdentifierDto.class))}), - @ApiResponse(responseCode = "400", - description = "Identifier form contains invalid request data", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "403", - description = "Insufficient access rights or authorities", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "405", - description = "Creating identifier not permitted", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "406", - description = "Creating identifier not allowed", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "409", - description = "Identifier for this resource already exists", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "502", - description = "Query information could not be retrieved", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<IdentifierDto> create(@NotNull @Valid @RequestBody IdentifierSaveDto data, - @NotNull @RequestHeader(name = "Authorization") String authorization, - @NotNull Principal principal) - throws IdentifierAlreadyExistsException, QueryNotFoundException, IdentifierPublishingNotAllowedException, - RemoteUnavailableException, UserNotFoundException, DatabaseNotFoundException, IdentifierRequestException, NotAllowedException, ViewNotFoundException { - log.debug("endpoint create identifier, data={}, authorization=(hidden), principal={}", data, principal); - if (data.getType().equals(IdentifierTypeDto.SUBSET) && (data.getQueryId() == null || data.getViewId() != null)) { - log.error("Identifier of type subset need to have a qid and not a vid present"); - throw new IdentifierRequestException("Identifier of type subset need to have a qid and not a vid present"); - } else if (data.getType().equals(IdentifierTypeDto.DATABASE) && (data.getQueryId() != null || data.getViewId() != null)) { - log.error("Identifier of type database must not have a qid and not a vid present"); - throw new IdentifierRequestException("Identifier of type database must not have a qid and not a vid present"); - } else if (data.getType().equals(IdentifierTypeDto.VIEW) && data.getQueryId() != null) { - log.error("Identifier of type view must not have a qid present"); - throw new IdentifierRequestException("Identifier of type database must not have a qid present"); - } - final User user = userService.findByUsername(principal.getName()); - try { - accessService.find(data.getDatabaseId(), user.getId()); - } catch (AccessDeniedException e) { - if (!User.hasRole(principal, "create-foreign-identifier")) { - log.error("Failed to create identifier: insufficient access"); - throw new NotAllowedException("Failed to create identifier: insufficient access"); - } - } - final Identifier identifier = identifierService.create(data, principal, authorization); - return ResponseEntity.status(HttpStatus.CREATED) - .body(identifierMapper.identifierToIdentifierDto(identifier)); - } - - @GetMapping("/retrieve") - @Timed(value = "identifier.retrieve", description = "Retrieve person or organization metadata from identifier") - @Operation(summary = "Retrieve metadata from identifier") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "Retrieved metadata from identifier", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = IdentifierDto.class))}), - }) - public ResponseEntity<ExternalMetadataDto> create(@NotNull @Valid @RequestParam String url) - throws OrcidNotFoundException, RorNotFoundException, RemoteUnavailableException, DoiNotFoundException { - return ResponseEntity.ok(metadataService.findByUrl(url)); - } - - -} diff --git a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/PersistenceEndpoint.java b/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/PersistenceEndpoint.java deleted file mode 100644 index 7560da55d3..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/endpoints/PersistenceEndpoint.java +++ /dev/null @@ -1,241 +0,0 @@ -package at.tuwien.endpoints; - -import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.api.identifier.BibliographyTypeDto; -import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.identifier.IdentifierSaveDto; -import at.tuwien.config.EndpointConfig; -import at.tuwien.entities.identifier.Identifier; -import at.tuwien.entities.user.User; -import at.tuwien.exception.*; -import at.tuwien.mapper.IdentifierMapper; -import at.tuwien.service.AccessService; -import at.tuwien.service.IdentifierService; -import at.tuwien.service.UserService; -import io.micrometer.core.annotation.Timed; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; - -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; -import java.security.Principal; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -@Log4j2 -@CrossOrigin(origins = "*") -@RestController -@RequestMapping("/api/pid") -public class PersistenceEndpoint { - - private final UserService userService; - private final AccessService accessService; - private final EndpointConfig endpointConfig; - private final IdentifierMapper identifierMapper; - private final IdentifierService identifierService; - - @Autowired - public PersistenceEndpoint(UserService userService, AccessService accessService, EndpointConfig endpointConfig, - IdentifierMapper identifierMapper, IdentifierService identifierService) { - this.userService = userService; - this.accessService = accessService; - this.endpointConfig = endpointConfig; - this.identifierMapper = identifierMapper; - this.identifierService = identifierService; - } - - @GetMapping("/{pid}") - @Transactional(readOnly = true) - @Timed(value = "pid.find", description = "Time needed to find a persisted identifier") - @Operation(summary = "Find some identifier") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "Found identifier successfully", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = IdentifierDto.class)), - @Content(mediaType = "text/csv"), - @Content(mediaType = "text/xml"), - @Content(mediaType = "text/bibliography"), - @Content(mediaType = "text/bibliography; style=apa"), - @Content(mediaType = "text/bibliography; style=ieee"), - @Content(mediaType = "text/bibliography; style=bibtex"), - }), - @ApiResponse(responseCode = "400", - description = "Identifier could not be exported, the requested style is not known", - content = {@Content( - mediaType = "text/bibliography", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "404", - description = "Identifier could not be exported from database as the resource was not found", - content = {@Content( - mediaType = "text/csv", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "502", - description = "Identifier could not exported from database as it is not reachable", - content = {@Content( - mediaType = "text/csv", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<?> find(@Valid @PathVariable("pid") Long pid, - @RequestHeader(HttpHeaders.ACCEPT) String accept) throws IdentifierNotFoundException, - QueryNotFoundException, RemoteUnavailableException, IdentifierRequestException { - log.debug("endpoint find identifier, pid={}, accept={}", pid, accept); - final Identifier identifier = identifierService.find(pid); - log.info("Found persistent identifier with id {}", identifier.getId()); - log.trace("found persistent identifier {}", identifier); - if (accept != null) { - log.trace("accept header present: {}", accept); - switch (accept) { - case "application/json": - log.trace("accept header matches json"); - final IdentifierDto resource1 = identifierMapper.identifierToIdentifierDto(identifier); - log.debug("find identifier resulted in identifier {}", resource1); - return ResponseEntity.ok(resource1); - case "text/csv": - log.trace("accept header matches csv"); - final InputStreamResource resource2; - try { - resource2 = identifierService.exportResource(pid); - log.debug("find identifier resulted in resource {}", resource2); - return ResponseEntity.ok(resource2); - } catch (IdentifierRequestException e) { - /* ignore */ - } - case "text/xml": - log.trace("accept header matches xml"); - final InputStreamResource resource3 = identifierService.exportMetadata(pid); - log.debug("find identifier resulted in resource {}", resource3); - return ResponseEntity.ok(resource3); - } - final Pattern regex = Pattern.compile("text\\/bibliography(; ?style=(apa|ieee|bibtex))?"); - final Matcher matcher = regex.matcher(accept); - if (matcher.find()) { - log.trace("accept header matches bibliography"); - final BibliographyTypeDto style; - if (matcher.group(2) != null) { - style = BibliographyTypeDto.valueOf(matcher.group(2).toUpperCase()); - log.trace("bibliography style matches {}", style); - } else { - style = BibliographyTypeDto.APA; - log.trace("no bibliography style provided, default: {}", style); - } - final String resource = identifierService.exportBibliography(pid, style); - log.debug("find identifier resulted in resource {}", resource); - return ResponseEntity.ok(resource); - } - } else { - log.trace("no accept header present"); - } - final HttpHeaders headers = new HttpHeaders(); - final String url = identifierMapper.identifierToLocationUrl(endpointConfig.getWebsiteUrl(), identifier); - headers.add("Location", url); - log.debug("find identifier resulted in http redirect, headers={}, url={}", headers, url); - return ResponseEntity.status(HttpStatus.MOVED_PERMANENTLY) - .headers(headers) - .build(); - } - - @PutMapping("/{id}") - @Transactional - @Timed(value = "identifier.update", description = "Time needed to update an identifier") - @PreAuthorize("hasAuthority('modify-identifier-metadata')") - @Operation(summary = "Update some identifier", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Updated identifier", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = IdentifierDto.class))}), - @ApiResponse(responseCode = "400", - description = "Identifier data is not valid to the form", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "404", - description = "Identifier or user could not be found", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "405", - description = "Updating identifier not permitted", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "406", - description = "Updating identifier not allowed", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<IdentifierDto> update(@NotNull @PathVariable("id") Long id, - @NotNull @Valid @RequestBody IdentifierSaveDto data, - @NotNull @RequestHeader(name = "Authorization") String authorization, - @NotNull Principal principal) - throws IdentifierNotFoundException, IdentifierRequestException, UserNotFoundException, NotAllowedException, - QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException { - log.debug("endpoint update identifier, id={}, data={}", id, data); - final Identifier identifier = identifierService.find(id); - final User user = userService.findByUsername(principal.getName()); - try { - accessService.find(identifier.getDatabase().getId(), user.getId()); - } catch (AccessDeniedException e) { - if (!User.hasRole(principal, "modify-identifier-metadata")) { - log.error("Failed to update identifier: insufficient access"); - throw new NotAllowedException("Failed to update identifier: insufficient access"); - } - } - /* check */ - final IdentifierDto dto = identifierMapper.identifierToIdentifierDto(identifierService.update(id, data, principal, authorization)); - log.debug("update identifier resulted in dto={}", dto); - return ResponseEntity.accepted() - .body(dto); - } - - @DeleteMapping("/{id}") - @Transactional - @Timed(value = "identifier.delete", description = "Time needed to delete an identifier") - @PreAuthorize("hasAuthority('delete-identifier')") - @Operation(summary = "Delete some identifier", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Deleted identifier", - content = {@Content}), - @ApiResponse(responseCode = "404", - description = "Identifier could not be found", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "405", - description = "Deleting identifier not permitted", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}) - }) - public ResponseEntity<?> delete(@NotNull @PathVariable("id") Long id) - throws IdentifierNotFoundException, NotAllowedException { - log.debug("endpoint delete identifier, id={}", id); - final Identifier identifier = identifierService.find(id); - if (identifier.getDoi() != null) { - log.error("Failed to delete identifier: a DOI is already attached"); - throw new NotAllowedException("Failed to delete identifier: a DOI is already attached"); - } - identifierService.delete(id); - return ResponseEntity.accepted() - .build(); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java b/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java deleted file mode 100644 index 27a6c76130..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java +++ /dev/null @@ -1,150 +0,0 @@ -package at.tuwien.handlers; - -import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.exception.*; -import io.swagger.v3.oas.annotations.Hidden; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.context.request.WebRequest; -import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; - -@ControllerAdvice -public class ApiExceptionHandler extends ResponseEntityExceptionHandler { - - @Hidden - @ResponseStatus(HttpStatus.FORBIDDEN) - @ExceptionHandler(AccessDeniedException.class) - public ResponseEntity<ApiErrorDto> handle(AccessDeniedException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.FORBIDDEN) - .message(e.getLocalizedMessage()) - .code("error.identifier.accessdenied") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler(DatabaseNotFoundException.class) - public ResponseEntity<ApiErrorDto> handle(DatabaseNotFoundException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.NOT_FOUND) - .message(e.getLocalizedMessage()) - .code("error.identifier.databasenotfound") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.CONFLICT) - @ExceptionHandler(IdentifierAlreadyExistsException.class) - public ResponseEntity<ApiErrorDto> handle(IdentifierAlreadyExistsException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.CONFLICT) - .message(e.getLocalizedMessage()) - .code("error.identifier.exists") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.PRECONDITION_FAILED) - @ExceptionHandler(IdentifierAlreadyPublishedException.class) - public ResponseEntity<ApiErrorDto> handle(IdentifierAlreadyPublishedException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.PRECONDITION_FAILED) - .message(e.getLocalizedMessage()) - .code("error.identifier.published") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler(IdentifierNotFoundException.class) - public ResponseEntity<ApiErrorDto> handle(IdentifierNotFoundException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.NOT_FOUND) - .message(e.getLocalizedMessage()) - .code("error.identifier.notfound") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.NOT_ACCEPTABLE) - @ExceptionHandler(IdentifierPublishingNotAllowedException.class) - public ResponseEntity<ApiErrorDto> handle(IdentifierPublishingNotAllowedException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.NOT_ACCEPTABLE) - .message(e.getLocalizedMessage()) - .code("error.identifier.publish") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(IdentifierRequestException.class) - public ResponseEntity<ApiErrorDto> handle(IdentifierRequestException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.BAD_REQUEST) - .message(e.getLocalizedMessage()) - .code("error.identifier.requestinvalid") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) - @ExceptionHandler(NotAllowedException.class) - public ResponseEntity<ApiErrorDto> handle(NotAllowedException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.METHOD_NOT_ALLOWED) - .message(e.getLocalizedMessage()) - .code("error.identifier.notallowed") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler(QueryNotFoundException.class) - public ResponseEntity<ApiErrorDto> handle(QueryNotFoundException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.NOT_FOUND) - .message(e.getLocalizedMessage()) - .code("error.identifier.query") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.BAD_GATEWAY) - @ExceptionHandler(RemoteUnavailableException.class) - public ResponseEntity<ApiErrorDto> handle(RemoteUnavailableException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.BAD_GATEWAY) - .message(e.getLocalizedMessage()) - .code("error.identifier.remote") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler(UserNotFoundException.class) - public ResponseEntity<ApiErrorDto> handle(UserNotFoundException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.NOT_FOUND) - .message(e.getLocalizedMessage()) - .code("error.identifier.usernotfound") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - -} \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/main/resources/application-doi.yml b/dbrepo-identifier-service/rest-service/src/main/resources/application-doi.yml deleted file mode 100644 index 4a6687e0e8..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/resources/application-doi.yml +++ /dev/null @@ -1,6 +0,0 @@ -fda: - datacite: - url: "${DATACITE_URL}" - prefix: "${DATACITE_PREFIX}" - username: "${DATACITE_USERNAME}" - password: "${DATACITE_PASSWORD}" \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/main/resources/application-local.yml b/dbrepo-identifier-service/rest-service/src/main/resources/application-local.yml deleted file mode 100644 index 08f6f6a496..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/resources/application-local.yml +++ /dev/null @@ -1,57 +0,0 @@ -app.version: '@project.version@' -spring: - main.banner-mode: off - datasource: - url: jdbc:mariadb://localhost:3306/fda - driver-class-name: org.mariadb.jdbc.Driver - username: root - password: dbrepo - jpa: - show-sql: false - database-platform: org.hibernate.dialect.MariaDBDialect - hibernate: - search: - default: - elasticsearch: - host: localhost - ddl-auto: validate - use-new-id-generator-mappings: false - open-in-view: false - properties: - hibernate: - default_schema: fda - jdbc: - time_zone: UTC - application: - name: identifier-service - cloud: - loadbalancer.ribbon.enabled: false - rabbitmq: - host: localhost - virtual-host: dbrepo - username: fda - password: fda - opensearch: - username: admin - password: admin - host: localhost - port: 9200 - protocol: http -management.endpoints.web.exposure.include: health,info,prometheus -server: - port: 9096 -logging: - pattern.console: "%d %highlight(%-5level) %msg%n" - level: - root: warn - at.tuwien.: trace - at.tuwien.auth.UserPermissionEvaluator: trace - org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -fda: - jwt: - issuer: http://localhost/realms/dbrepo - public_key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB - client_secret: client-secret - client_id: dbrepo-client - gateway.endpoint: http://localhost - website: http://localhost \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/main/resources/application.yml b/dbrepo-identifier-service/rest-service/src/main/resources/application.yml deleted file mode 100644 index 9701f85dd6..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/resources/application.yml +++ /dev/null @@ -1,72 +0,0 @@ -app.version: '@project.version@' -spring: - main.banner-mode: off - autoconfigure: - exclude: org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration - datasource: - url: "jdbc:mariadb://metadata-db:3306/${METADATA_DB}" - driver-class-name: org.mariadb.jdbc.Driver - username: "${METADATA_USERNAME}" - password: "${METADATA_PASSWORD}" - jpa: - show-sql: false - database-platform: org.hibernate.dialect.MariaDBDialect - hibernate: - search: - default: - elasticsearch: - host: search-db - ddl-auto: validate - use-new-id-generator-mappings: false - open-in-view: false - properties: - hibernate: - default_schema: "${METADATA_DB}" - jdbc: - time_zone: UTC - application: - name: identifier-service - cloud: - loadbalancer.ribbon.enabled: false - rabbitmq: - host: broker-service - virtual-host: dbrepo - username: "${BROKER_USERNAME}" - password: "${BROKER_PASSWORD}" - opensearch: - username: "${SEARCH_USERNAME}" - password: "${SEARCH_PASSWORD}" - host: search-db - port: 9200 - protocol: http -management: - endpoints: - web: - exposure: - include: health,info,prometheus - endpoint: - health: - probes: - enabled: true - health: - readinessState: - enabled: true - livenessState: - enabled: true -server: - port: 9096 -logging: - pattern.console: "%d %highlight(%-5level) %msg%n" - level: - root: warn - at.tuwien.: "${LOG_LEVEL}" - at.tuwien.auth.UserPermissionEvaluator: trace - org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -fda: - jwt: - issuer: "${JWT_ISSUER}" - public_key: "${JWT_PUBKEY}" - client_secret: "${DBREPO_CLIENT_SECRET}" - client_id: "${CLIENT_ID}" - gateway.endpoint: "${GATEWAY_ENDPOINT}" - website: "${WEBSITE}" \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/main/resources/config.properties b/dbrepo-identifier-service/rest-service/src/main/resources/config.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-identifier-service/rest-service/src/main/resources/templates/cite_apa.txt b/dbrepo-identifier-service/rest-service/src/main/resources/templates/cite_apa.txt deleted file mode 100644 index a005306264..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/resources/templates/cite_apa.txt +++ /dev/null @@ -1 +0,0 @@ -[# th:each="creator,idx: ${creators}"][# th:if="${idx.index} > 0 and ${idx.index} != ${idx.size} - 1 and ${idx.index} != 0"], [/][# th:if="${idx.index} == ${idx.size} - 1 and ${idx.size} != 1"] & [/][[${creator.getApaName()}]][/][# th:if="${creators.size()} > 0"]. [/]([[${publicationYear}]]). [[${title.getTitle()}]]. [[${publisher}]]. [[${identifierType} == 'doi' ? 'https://doi.org/' : '']][[${identifier}]] \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/main/resources/templates/cite_bibtex.txt b/dbrepo-identifier-service/rest-service/src/main/resources/templates/cite_bibtex.txt deleted file mode 100644 index 3165c7d39e..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/resources/templates/cite_bibtex.txt +++ /dev/null @@ -1,7 +0,0 @@ -@misc{dbrepo[[${publicationYear}]], - author = {[# th:each="creator,idx: ${creators}"][# th:if="${idx.index} > 0"] and [/][[${creator.getBibtexName()}]][/]}, - title = {[[${title.getTitle()}]]}, - [[${identifierType}]] = {[[${identifierType} == 'url' ? '\url{' : '']][[${identifier}]][[${identifierType} == 'url' ? '}' : '']]}, - month = {[[${publicationMonth}]]}, - year = {[[${publicationYear}]]} -} \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/main/resources/templates/cite_ieee.txt b/dbrepo-identifier-service/rest-service/src/main/resources/templates/cite_ieee.txt deleted file mode 100644 index d1da091e1e..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/resources/templates/cite_ieee.txt +++ /dev/null @@ -1 +0,0 @@ -[1] [# th:each="creator,idx: ${creators}"][# th:if="${idx.index} > 0"], [/][[${creator.getIeeeName()}]][/][# th:if="${creators.size()} > 0"], [/]“[[${title.getTitle()}]]“, [[${publisher}]], [[${publicationYear}]], [[${identifierType} == 'url' ? 'Available: ' : 'doi: ']][[${identifier}]]. \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/main/resources/templates/doi.xml b/dbrepo-identifier-service/rest-service/src/main/resources/templates/doi.xml deleted file mode 100644 index 28d65ef38d..0000000000 --- a/dbrepo-identifier-service/rest-service/src/main/resources/templates/doi.xml +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://datacite.org/schema/kernel-4" - xsi:schemaLocation="http://datacite.org/schema/kernel-4 https://schema.datacite.org/meta/kernel-4.4/metadata.xsd"> - <identifier th:attr="identifierType=${identifierType}">[[${identifier}]]</identifier> - <creators th:if="${not #lists.isEmpty(creators)}"> - <creator th:each="creator: ${creators}"> - <creatorName th:attr="nameType=${creator.nameType}">[[${creator.lastname}]], [[${creator.firstname}]]</creatorName> - <givenName th:if="${creator.firstname != null}">[[${creator.firstname}]]</givenName> - <familyName th:if="${creator.lastname != null}">[[${creator.lastname}]]</familyName> - <nameIdentifier th:if="${creator.nameIdentifier != null}" - th:attr="schemeURI=${creator.nameIdentifierSchemeUri},nameIdentifierScheme=${creator.nameIdentifierScheme}"> - [[${creator.nameIdentifier}]] - </nameIdentifier> - <affiliation th:if="${creator.affiliation != null}" th:attr="affiliationIdentifier=${creator.affiliationIdentifier},affiliationIdentifierScheme=${creator.affiliationIdentifierScheme},schemeURI=${creator.affiliationIdentifierSchemeUri}">[[${creator.affiliation}]]</affiliation> - </creator> - </creators> - <titles> - <title th:each="title: ${titles}" th:xmllang="${title.language}" th:attr="titleType=${title.titleType}">[[${title.title}]]</title> - </titles> - <publisher>[[${publisher}]]</publisher> - <publicationYear>[[${publicationYear}]]</publicationYear> - <dates> - <date dateType="Issued">[[${created}]]</date> - <date dateType="Available">[[${created}]]</date> - </dates> - <language th:if="${language != null}">[[${language}]]</language> - <resourceType resourceTypeGeneral="Dataset">Dataset</resourceType> - <relatedIdentifiers th:if="${not #lists.isEmpty(relatedIdentifiers)}"> - <relatedIdentifier th:each="relatedIdentifier: ${relatedIdentifiers}" - th:attr="relatedIdentifierType=${relatedIdentifier.type},relationType=${relatedIdentifier.relation}"> - [[${relatedIdentifier.value}]] - </relatedIdentifier> - </relatedIdentifiers> - <rightsList th:if="${not #lists.isEmpty(licenses)}"> - <rights th:each="license: ${licenses}" th:attr="rightsURI=${license.uri}">[[${license.identifier}]]</rights> - </rightsList> - <descriptions> - <description th:each="description: ${descriptions}" th:attr="descriptionType=${description.descriptionType}" - th:xmllang="${description.language}">[[${description.description}]]</description> - </descriptions> - <fundingReferences th:if="${not #lists.isEmpty(funders)}"> - <fundingReference th:each="funder: ${funders}"> - <funderName>[[${funder.funderName}</funderName> - <funderIdentifier th:if="${funder.funderIdentifier != null}" th:attr="funderIdentifierType=${funder.funderIdentifierType}">[[${funder.funderIdentifier}]]</funderIdentifier> - <awardNumber th:if="${funder.awardNumber != null}">[[${funder.awardNumber}]]</awardNumber> - <awardTitle th:if="${funder.awardTitle}">[[${funder.awardTitle}]]</awardTitle> - </fundingReference> - </fundingReferences> - <version>1.0</version> -</resource> \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java deleted file mode 100644 index 01f84e12b9..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien; - -import at.tuwien.test.BaseTest; -import org.springframework.test.context.TestPropertySource; - -@TestPropertySource(locations = "classpath:application.properties") -public abstract class BaseUnitTest extends BaseTest { - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/ActuatorComponentTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/ActuatorComponentTest.java deleted file mode 100644 index 5626b5cda8..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/ActuatorComponentTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@Log4j2 -@ExtendWith(SpringExtension.class) -@AutoConfigureMockMvc -@SpringBootTest -public class ActuatorComponentTest extends BaseUnitTest { - - @MockBean - private IdentifierIdxRepository identifierIdxRepository; - - @Autowired - private MockMvc mockMvc; - - @Test - public void actuatorInfo_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/info")) - .andDo(print()) - .andExpect(status().isOk()); - } - - @Test - public void actuatorStatus_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/health")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.status").value("UP")); - } - - @Test - public void actuatorLiveness_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/health/liveness")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.status").value("UP")); - } - - @Test - public void actuatorReadiness_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/health/readiness")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.status").value("UP")); - } - - @Test - public void actuatorPrometheus_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/prometheus")); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointIntegrationTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointIntegrationTest.java deleted file mode 100644 index c7d774799d..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointIntegrationTest.java +++ /dev/null @@ -1,309 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.identifier.IdentifierDescriptionDto; -import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.identifier.IdentifierTitleDto; -import at.tuwien.api.identifier.IdentifierTypeDto; -import at.tuwien.endpoints.IdentifierEndpoint; -import at.tuwien.exception.NotAllowedException; -import at.tuwien.repository.mdb.*; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.test.context.support.WithAnonymousUser; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -@Log4j2 -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@ExtendWith(SpringExtension.class) -@SpringBootTest -public class IdentifierEndpointIntegrationTest extends BaseUnitTest { - - @MockBean - private IdentifierIdxRepository identifierIdxRepository; - - @Autowired - private IdentifierRepository identifierRepository; - - @Autowired - private DatabaseRepository databaseRepository; - - @Autowired - private ImageRepository imageRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private ContainerRepository containerRepository; - - @Autowired - private RealmRepository realmRepository; - - @Autowired - private LicenseRepository licenseRepository; - - @Autowired - private IdentifierEndpoint identifierEndpoint; - - @BeforeEach - public void beforeEach() { - imageRepository.save(IMAGE_1); - realmRepository.save(REALM_DBREPO); - licenseRepository.save(LICENSE_1); - userRepository.save(USER_1); - userRepository.save(USER_2); - userRepository.save(USER_3); - userRepository.save(USER_4); - containerRepository.save(CONTAINER_1_SIMPLE); - containerRepository.save(CONTAINER_2_SIMPLE); - containerRepository.save(CONTAINER_3_SIMPLE); - containerRepository.save(CONTAINER_4_SIMPLE); - databaseRepository.save(DATABASE_1_SIMPLE); - databaseRepository.save(DATABASE_2_SIMPLE); - databaseRepository.save(DATABASE_3_SIMPLE); - databaseRepository.save(DATABASE_4_SIMPLE); - } - - @Test - @Transactional - @WithAnonymousUser - public void list_anonymous_succeeds() { - - /* mock */ - identifierRepository.save(IDENTIFIER_1); - - /* test */ - final List<IdentifierDto> response = generic_list(null, null, null, null); - assertEquals(1, response.size()); - final IdentifierDto identifier = response.get(0); - assertEquals(IDENTIFIER_1_ID, identifier.getId()); - final List<IdentifierTitleDto> titles = identifier.getTitles(); - assertEquals(2, titles.size()); - final IdentifierTitleDto title0 = titles.get(0); - assertEquals(IDENTIFIER_1_TITLE_1_TITLE, title0.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_1_LANG_DTO, title0.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_1_TYPE_DTO, title0.getTitleType()); - final IdentifierTitleDto title1 = titles.get(1); - assertEquals(IDENTIFIER_1_TITLE_2_TITLE, title1.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_2_LANG_DTO, title1.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_2_TYPE_DTO, title1.getTitleType()); - final List<IdentifierDescriptionDto> descriptions = identifier.getDescriptions(); - assertEquals(1, descriptions.size()); - final IdentifierDescriptionDto description0 = descriptions.get(0); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION, description0.getDescription()); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_LANG_DTO, description0.getLanguage()); - } - - @Test - @Transactional - @WithMockUser(username = USER_1_USERNAME, authorities = {"list-identifiers"}) - public void list_hasRole_succeeds() { - - /* mock */ - identifierRepository.save(IDENTIFIER_1); - - /* test */ - final List<IdentifierDto> response = generic_list(null, null, null, null); - assertEquals(1, response.size()); - final IdentifierDto identifier = response.get(0); - assertEquals(IDENTIFIER_1_ID, identifier.getId()); - final List<IdentifierTitleDto> titles = identifier.getTitles(); - assertEquals(2, titles.size()); - final IdentifierTitleDto title0 = titles.get(0); - assertEquals(IDENTIFIER_1_TITLE_1_TITLE, title0.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_1_LANG_DTO, title0.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_1_TYPE_DTO, title0.getTitleType()); - final IdentifierTitleDto title1 = titles.get(1); - assertEquals(IDENTIFIER_1_TITLE_2_TITLE, title1.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_2_LANG_DTO, title1.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_2_TYPE_DTO, title1.getTitleType()); - final List<IdentifierDescriptionDto> descriptions = identifier.getDescriptions(); - assertEquals(1, descriptions.size()); - final IdentifierDescriptionDto description0 = descriptions.get(0); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION, description0.getDescription()); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_LANG_DTO, description0.getLanguage()); - } - - @Test - @Transactional - @WithMockUser(username = USER_4_USERNAME) - public void list_noRole_succeeds() { - - /* mock */ - identifierRepository.save(IDENTIFIER_1); - - /* test */ - final List<IdentifierDto> response = generic_list(null, null, null, null); - assertEquals(1, response.size()); - final IdentifierDto identifier = response.get(0); - final List<IdentifierTitleDto> titles = identifier.getTitles(); - assertEquals(2, titles.size()); - final IdentifierTitleDto title0 = titles.get(0); - assertEquals(IDENTIFIER_1_TITLE_1_TITLE, title0.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_1_LANG_DTO, title0.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_1_TYPE_DTO, title0.getTitleType()); - final IdentifierTitleDto title1 = titles.get(1); - assertEquals(IDENTIFIER_1_TITLE_2_TITLE, title1.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_2_LANG_DTO, title1.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_2_TYPE_DTO, title1.getTitleType()); - final List<IdentifierDescriptionDto> descriptions = identifier.getDescriptions(); - assertEquals(1, descriptions.size()); - final IdentifierDescriptionDto description0 = descriptions.get(0); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION, description0.getDescription()); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_LANG_DTO, description0.getLanguage()); - } - - @Test - @Transactional - @WithMockUser(username = USER_1_USERNAME) - public void list_databaseId_succeeds() { - - /* mock */ - identifierRepository.save(IDENTIFIER_1); - - /* test */ - final List<IdentifierDto> response = generic_list(DATABASE_1_ID, null, null, null); - assertEquals(1, response.size()); - final IdentifierDto identifier = response.get(0); - final List<IdentifierTitleDto> titles = identifier.getTitles(); - assertEquals(2, titles.size()); - final IdentifierTitleDto title0 = titles.get(0); - assertEquals(IDENTIFIER_1_TITLE_1_TITLE, title0.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_1_LANG_DTO, title0.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_1_TYPE_DTO, title0.getTitleType()); - final IdentifierTitleDto title1 = titles.get(1); - assertEquals(IDENTIFIER_1_TITLE_2_TITLE, title1.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_2_LANG_DTO, title1.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_2_TYPE_DTO, title1.getTitleType()); - final List<IdentifierDescriptionDto> descriptions = identifier.getDescriptions(); - assertEquals(1, descriptions.size()); - final IdentifierDescriptionDto description0 = descriptions.get(0); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION, description0.getDescription()); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_LANG_DTO, description0.getLanguage()); - } - - @Test - @WithMockUser(username = USER_1_USERNAME) - public void list_viewId_succeeds() { - - /* mock */ - identifierRepository.saveAll(List.of(IDENTIFIER_1, IDENTIFIER_2, IDENTIFIER_3, IDENTIFIER_4, IDENTIFIER_5, IDENTIFIER_6)); - - /* test */ - final List<IdentifierDto> reponse = generic_list(null, null, VIEW_1_ID, null); - assertEquals(1, reponse.size()); - } - - @Test - @WithMockUser(username = USER_1_USERNAME) - public void list_viewType_succeeds() { - - /* mock */ - identifierRepository.saveAll(List.of(IDENTIFIER_1, IDENTIFIER_2, IDENTIFIER_3, IDENTIFIER_4, IDENTIFIER_5, IDENTIFIER_6)); - - /* test */ - final List<IdentifierDto> reponse = generic_list(null, null, null, IdentifierTypeDto.VIEW); - assertEquals(1, reponse.size()); - } - - @Test - @WithMockUser(username = USER_1_USERNAME) - public void list_databaseIdAndType_succeeds() { - - /* mock */ - identifierRepository.save(IDENTIFIER_1); - - /* test */ - final List<IdentifierDto> response = generic_list(DATABASE_1_ID, null, null, IdentifierTypeDto.DATABASE); - assertEquals(1, response.size()); - final IdentifierDto identifier = response.get(0); - assertEquals(0, identifier.getTitles().size()); - assertEquals(0, identifier.getDescriptions().size()); - } - - @Test - @Transactional - @WithMockUser(username = USER_1_USERNAME) - public void list_subsetIdAndType_succeeds() { - - /* mock */ - identifierRepository.save(IDENTIFIER_1); - - /* test */ - final List<IdentifierDto> response = generic_list(DATABASE_1_ID, QUERY_1_ID, null, IdentifierTypeDto.DATABASE); - assertEquals(1, response.size()); - final IdentifierDto identifier = response.get(0); - final List<IdentifierTitleDto> titles = identifier.getTitles(); - assertEquals(2, titles.size()); - final IdentifierTitleDto title0 = titles.get(0); - assertEquals(IDENTIFIER_1_TITLE_1_TITLE, title0.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_1_LANG_DTO, title0.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_1_TYPE_DTO, title0.getTitleType()); - final IdentifierTitleDto title1 = titles.get(1); - assertEquals(IDENTIFIER_1_TITLE_2_TITLE, title1.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_2_LANG_DTO, title1.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_2_TYPE_DTO, title1.getTitleType()); - final List<IdentifierDescriptionDto> descriptions = identifier.getDescriptions(); - assertEquals(1, descriptions.size()); - final IdentifierDescriptionDto description0 = descriptions.get(0); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION, description0.getDescription()); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_LANG_DTO, description0.getLanguage()); - } - - @Test - @Transactional - @WithMockUser(username = USER_4_USERNAME) - public void create_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - identifierEndpoint.create(IDENTIFIER_2_DTO_REQUEST, "ABC", USER_4_PRINCIPAL); - }); - } - - @Test - @Transactional - @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void create_accessNotExists_fails() { - - /* mock */ - containerRepository.save(CONTAINER_3_SIMPLE); - databaseRepository.save(DATABASE_3_SIMPLE); - - /* test */ - assertThrows(NotAllowedException.class, () -> { - identifierEndpoint.create(IDENTIFIER_3_DTO_REQUEST, "ABC", USER_1_PRINCIPAL); - }); - } - - /* ################################################################################################### */ - /* ## GENERIC TEST CASES ## */ - /* ################################################################################################### */ - - protected List<IdentifierDto> generic_list(Long databaseId, Long queryId, Long viewId, IdentifierTypeDto type) { - - /* test */ - final ResponseEntity<List<IdentifierDto>> response = identifierEndpoint.list(databaseId, queryId, viewId, type); - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertNotNull(response.getBody()); - return response.getBody(); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointUnitTest.java deleted file mode 100644 index 0b5e179679..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/IdentifierEndpointUnitTest.java +++ /dev/null @@ -1,331 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.identifier.*; -import at.tuwien.config.EndpointConfig; -import at.tuwien.endpoints.IdentifierEndpoint; -import at.tuwien.endpoints.PersistenceEndpoint; -import at.tuwien.entities.database.Database; -import at.tuwien.entities.database.DatabaseAccess; -import at.tuwien.entities.identifier.Identifier; -import at.tuwien.entities.user.User; -import at.tuwien.exception.*; -import at.tuwien.gateway.QueryServiceGateway; -import at.tuwien.repository.mdb.*; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import at.tuwien.service.AccessService; -import at.tuwien.service.IdentifierService; -import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.test.context.support.WithAnonymousUser; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.io.File; -import java.io.IOException; -import java.security.Principal; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.when; - -@ExtendWith(SpringExtension.class) -@SpringBootTest -public class IdentifierEndpointUnitTest extends BaseUnitTest { - - @MockBean - private IdentifierService identifierService; - - @MockBean - private DatabaseRepository databaseRepository; - - @MockBean - private IdentifierRepository identifierRepository; - - @MockBean - private AccessService accessService; - - @MockBean - private UserRepository userRepository; - - @MockBean - private AccessRepository accessRepository; - - @MockBean - private QueryServiceGateway queryServiceGateway; - - @MockBean - private IdentifierIdxRepository identifierIdxRepository; - - @Autowired - private IdentifierEndpoint identifierEndpoint; - - @Autowired - private PersistenceEndpoint persistenceEndpoint; - - @Autowired - private EndpointConfig endpointConfig; - - @Test - @WithAnonymousUser - public void find_json_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException { - final String accept = "application/json"; - - /* mock */ - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final IdentifierDto body = (IdentifierDto) response.getBody(); - assertNotNull(body); - final List<IdentifierTitleDto> titles = body.getTitles(); - assertEquals(2, titles.size()); - final IdentifierTitleDto title0 = titles.get(0); - assertEquals(IDENTIFIER_1_TITLE_1_TITLE, title0.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_1_LANG_DTO, title0.getLanguage()); - final List<IdentifierDescriptionDto> descriptions = body.getDescriptions(); - assertEquals(1, descriptions.size()); - final IdentifierDescriptionDto description0 = descriptions.get(0); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION, description0.getDescription()); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_LANG_DTO, description0.getLanguage()); - } - - @Test - @WithAnonymousUser - public void find_xml_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final InputStreamResource resource = new InputStreamResource(FileUtils.openInputStream( - new File("src/test/resources/xml/datacite-example-dataset-v4.xml"))); - - /* test */ - final ResponseEntity<?> response = generic_find("text/xml", resource); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final InputStreamResource body = (InputStreamResource) response.getBody(); - assertNotNull(body); - assertTrue(body.exists()); - assertEquals(resource, body); - } - - @Test - @WithAnonymousUser - public void find_csv_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IOException, IdentifierRequestException { - final InputStreamResource resource = new InputStreamResource(FileUtils.openInputStream( - new File("src/test/resources/csv/testdata.csv"))); - - /* test */ - final ResponseEntity<?> response = generic_find("text/csv", resource); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final InputStreamResource body = (InputStreamResource) response.getBody(); - assertNotNull(body); - assertTrue(body.exists()); - assertEquals(resource, body); - } - - @Test - @WithAnonymousUser - public void find_httpRedirect_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException { - - /* test */ - final ResponseEntity<?> response = generic_find(null, null); - assertEquals(HttpStatus.MOVED_PERMANENTLY, response.getStatusCode()); - assertNotNull(response.getHeaders().get("Location")); - assertEquals(endpointConfig.getWebsiteUrl() + "/database/" - + IDENTIFIER_1_DATABASE_ID, response.getHeaders().getFirst("Location")); - } - - @Test - @WithAnonymousUser - public void create_anonymousDatabase_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - generic_create(DATABASE_1_ID, DATABASE_1, null, IDENTIFIER_1_DTO_REQUEST, null, null, null, null, null); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void create_hasRoleDatabase_succeeds() throws IdentifierAlreadyExistsException, - UserNotFoundException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, - IdentifierPublishingNotAllowedException, IdentifierRequestException, NotAllowedException, - ViewNotFoundException, at.tuwien.exception.AccessDeniedException { - - /* mock */ - when(accessRepository.findByHdbidAndHuserid(DATABASE_1_ID, USER_1_ID)) - .thenReturn(Optional.of(DATABASE_1_USER_1_READ_ACCESS)); - - /* test */ - generic_create(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_1_READ_ACCESS, IDENTIFIER_1_DTO_REQUEST, IDENTIFIER_1, USER_1_PRINCIPAL, USER_1_ID, USER_1_USERNAME, USER_1); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void create_hasRoleDatabaseNoAccess_fails() { - - /* test */ - assertThrows(NotAllowedException.class, () -> { - generic_create(DATABASE_1_ID, DATABASE_1, null, IDENTIFIER_1_DTO_REQUEST, IDENTIFIER_1, USER_1_PRINCIPAL, USER_1_ID, USER_1_USERNAME, USER_1); - }); - } - - @Test - @WithAnonymousUser - public void create_anonymousQuery_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - generic_create(DATABASE_2_ID, DATABASE_2, null, IDENTIFIER_2_DTO_REQUEST, IDENTIFIER_2, null, null, null, null); - }); - } - - @Test - @WithMockUser(username = USER_2_USERNAME, authorities = {"create-identifier"}) - public void create_hasRoleReadAccessQuery_succeeds() throws IdentifierAlreadyExistsException, - UserNotFoundException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, - IdentifierPublishingNotAllowedException, IdentifierRequestException, NotAllowedException, - at.tuwien.exception.AccessDeniedException, ViewNotFoundException { - - /* test */ - generic_create(DATABASE_2_ID, DATABASE_2, DATABASE_2_USER_1_READ_ACCESS, IDENTIFIER_2_DTO_REQUEST, IDENTIFIER_2, USER_2_PRINCIPAL, USER_2_ID, USER_2_USERNAME, USER_2); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void create_invalidSubset_fails() { - final IdentifierSaveDto request = IdentifierSaveDto.builder() - .queryId(null) // <-- - .databaseId(IDENTIFIER_1_DATABASE_ID) - .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO)) - .titles(List.of(IDENTIFIER_1_TITLE_1_CREATE_DTO)) - .relatedIdentifiers(List.of()) - .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH) - .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR) - .creators(List.of(IDENTIFIER_2_CREATOR_1_CREATE_DTO, IDENTIFIER_2_CREATOR_2_CREATE_DTO)) - .publisher(IDENTIFIER_1_PUBLISHER) - .type(IdentifierTypeDto.SUBSET) - .build(); - - /* test */ - assertThrows(IdentifierRequestException.class, () -> { - generic_create(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_1_READ_ACCESS, request, null, USER_1_PRINCIPAL, USER_1_ID, USER_1_USERNAME, USER_1); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void create_invalidDatabase_fails() { - final IdentifierSaveDto request = IdentifierSaveDto.builder() - .queryId(IDENTIFIER_1_QUERY_ID) // <-- - .databaseId(IDENTIFIER_1_DATABASE_ID) - .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO)) - .titles(List.of(IDENTIFIER_1_TITLE_1_CREATE_DTO)) - .relatedIdentifiers(List.of(IDENTIFIER_1_RELATED_IDENTIFIER_2_CREATE_DTO)) - .publicationDay(IDENTIFIER_2_PUBLICATION_DAY) - .publicationMonth(IDENTIFIER_2_PUBLICATION_MONTH) - .publicationYear(IDENTIFIER_2_PUBLICATION_YEAR) - .creators(List.of(IDENTIFIER_2_CREATOR_1_CREATE_DTO, IDENTIFIER_2_CREATOR_2_CREATE_DTO)) - .publisher(IDENTIFIER_2_PUBLISHER) - .type(IdentifierTypeDto.DATABASE) - .build(); - - /* test */ - assertThrows(IdentifierRequestException.class, () -> { - generic_create(DATABASE_1_ID, DATABASE_1, DATABASE_1_USER_1_READ_ACCESS, request, null, USER_1_PRINCIPAL, USER_1_ID, USER_1_USERNAME, USER_1); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"create-identifier"}) - public void create_queryForeign_fails() { - - /* test */ - assertThrows(NotAllowedException.class, () -> { - generic_create(DATABASE_2_ID, DATABASE_2, null, IDENTIFIER_2_DTO_REQUEST, IDENTIFIER_2, USER_1_PRINCIPAL, USER_1_ID, USER_1_USERNAME, USER_1); - }); - } - - /* ################################################################################################### */ - /* ## GENERIC TEST CASES ## */ - /* ################################################################################################### */ - - protected void generic_create(Long databaseId, Database database, DatabaseAccess access, - IdentifierSaveDto data, Identifier identifier, Principal principal, UUID userId, - String username, User user) throws QueryNotFoundException, RemoteUnavailableException, - IdentifierAlreadyExistsException, UserNotFoundException, DatabaseNotFoundException, - IdentifierPublishingNotAllowedException, IdentifierRequestException, NotAllowedException, - at.tuwien.exception.AccessDeniedException, ViewNotFoundException { - - /* mock */ - when(databaseRepository.findById(databaseId)) - .thenReturn(Optional.of(database)); - if (user == null) { - when(userRepository.findByUsername(username)) - .thenReturn(Optional.empty()); - } else { - when(userRepository.findByUsername(username)) - .thenReturn(Optional.of(user)); - } - if (access != null) { - when(accessService.find(databaseId, userId)) - .thenReturn(access); - } else { - doThrow(at.tuwien.exception.AccessDeniedException.class) - .when(accessService) - .find(databaseId, userId); - } - when(queryServiceGateway.find(databaseId, data, "ABC")) - .thenReturn(QUERY_1_DTO); - when(identifierService.create(data, principal, "ABC")) - .thenReturn(identifier); - when(identifierRepository.save(any(Identifier.class))) - .thenReturn(identifier) - .thenReturn(identifier); - - /* test */ - final ResponseEntity<IdentifierDto> response = identifierEndpoint.create(data, "ABC", principal); - assertEquals(HttpStatus.CREATED, response.getStatusCode()); - final IdentifierDto body = response.getBody(); - assertNotNull(body); - assertEquals(identifier.getId(), body.getId()); - assertEquals(identifier.getQuery(), body.getQuery()); - assertEquals(identifier.getQueryHash(), body.getQueryHash()); - assertEquals(identifier.getResultHash(), body.getResultHash()); - assertEquals(identifier.getResultNumber(), body.getResultNumber()); - } - - protected ResponseEntity<?> generic_find(String accept, InputStreamResource resource) - throws IdentifierNotFoundException, QueryNotFoundException, RemoteUnavailableException, - IdentifierRequestException { - - /* mock */ - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1); - if (resource != null) { - when(identifierService.exportResource(IDENTIFIER_1_ID)) - .thenReturn(resource); - when(identifierService.exportMetadata(IDENTIFIER_1_ID)) - .thenReturn(resource); - } - - /* test */ - return persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/PersistenceEndpointUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/PersistenceEndpointUnitTest.java deleted file mode 100644 index e89cda19dc..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/PersistenceEndpointUnitTest.java +++ /dev/null @@ -1,672 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.identifier.BibliographyTypeDto; -import at.tuwien.api.identifier.CreatorDto; -import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.api.identifier.IdentifierSaveDto; -import at.tuwien.endpoints.PersistenceEndpoint; -import at.tuwien.entities.identifier.Identifier; -import at.tuwien.entities.user.User; -import at.tuwien.exception.*; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import at.tuwien.service.AccessService; -import at.tuwien.service.IdentifierService; -import at.tuwien.service.UserService; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Primary; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.test.context.support.WithAnonymousUser; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.security.Principal; -import java.util.TimeZone; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -@ExtendWith(SpringExtension.class) -@SpringBootTest -public class PersistenceEndpointUnitTest extends BaseUnitTest { - - @MockBean - private IdentifierIdxRepository identifierIdxRepository; - - @MockBean - private AccessService accessService; - - @MockBean - private IdentifierService identifierService; - - @MockBean - private UserService userService; - - @Autowired - private ObjectMapper objectMapper; - - @Autowired - private PersistenceEndpoint persistenceEndpoint; - - @Bean - @Primary - public ObjectMapper objectMapper() { - final ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.registerModule(new Jdk8Module()); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - objectMapper.setTimeZone(TimeZone.getTimeZone("UTC")); - return objectMapper; - } - - @Test - @WithAnonymousUser - public void find_json0_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "application/json"; - final IdentifierDto compare = objectMapper.readValue(FileUtils.readFileToString(new File("src/test/resources/json/metadata0.json"), StandardCharsets.UTF_8), IdentifierDto.class); - - /* mock */ - when(identifierService.find(IDENTIFIER_4_ID)) - .thenReturn(IDENTIFIER_4); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_4_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final IdentifierDto body = (IdentifierDto) response.getBody(); - assertNotNull(body); - assertEquals(compare.getId(), body.getId()); - assertEquals(compare.getTitles().size(), body.getTitles().size()); - assertEquals(compare.getDescriptions().size(), body.getDescriptions().size()); - assertEquals(compare.getDescriptions(), body.getDescriptions()); - assertEquals(compare.getDatabase().getId(), body.getDatabase().getId()); - assertEquals(compare.getCreated(), body.getCreated()); - assertEquals(compare.getLastModified(), body.getLastModified()); - assertEquals(compare.getDoi(), body.getDoi()); - assertEquals(compare.getLicenses().size(), body.getLicenses().size()); - assertEquals(compare.getPublicationDay(), body.getPublicationDay()); - assertEquals(compare.getPublicationMonth(), body.getPublicationMonth()); - assertEquals(compare.getPublicationYear(), body.getPublicationYear()); - assertEquals(compare.getPublisher(), body.getPublisher()); - assertEquals(compare.getCreators().size(), body.getCreators().size()); - } - - @Test - @WithAnonymousUser - public void find_json1_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "application/json"; - final IdentifierDto compare = objectMapper.readValue(FileUtils.readFileToString(new File("src/test/resources/json/metadata1.json"), StandardCharsets.UTF_8), IdentifierDto.class); - - /* mock */ - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final IdentifierDto body = (IdentifierDto) response.getBody(); - assertNotNull(body); - assertEquals(compare.getId(), body.getId()); - assertEquals(compare.getTitles().size(), body.getTitles().size()); - assertEquals(compare.getTitles().get(0).getId(), body.getTitles().get(0).getId()); - assertEquals(compare.getTitles().get(0).getTitle(), body.getTitles().get(0).getTitle()); - assertEquals(compare.getTitles().get(0).getLanguage(), body.getTitles().get(0).getLanguage()); - assertEquals(compare.getTitles().get(0).getTitleType(), body.getTitles().get(0).getTitleType()); - assertEquals(compare.getDescriptions().size(), body.getDescriptions().size()); - assertEquals(compare.getDescriptions().get(0).getId(), body.getDescriptions().get(0).getId()); - assertEquals(compare.getDescriptions().get(0).getDescription(), body.getDescriptions().get(0).getDescription()); - assertEquals(compare.getDescriptions().get(0).getLanguage(), body.getDescriptions().get(0).getLanguage()); - assertEquals(compare.getDescriptions().get(0).getDescriptionType(), body.getDescriptions().get(0).getDescriptionType()); - assertEquals(compare.getDatabase().getId(), body.getDatabase().getId()); - assertEquals(compare.getCreated(), body.getCreated()); - assertEquals(compare.getLastModified(), body.getLastModified()); - assertEquals(compare.getDoi(), body.getDoi()); - assertEquals(compare.getLicenses().size(), body.getLicenses().size()); - assertEquals(compare.getLicenses().get(0).getIdentifier(), body.getLicenses().get(0).getIdentifier()); - assertEquals(compare.getLicenses().get(0).getUri(), body.getLicenses().get(0).getUri()); - assertEquals(compare.getPublicationDay(), body.getPublicationDay()); - assertEquals(compare.getPublicationMonth(), body.getPublicationMonth()); - assertEquals(compare.getPublicationYear(), body.getPublicationYear()); - assertEquals(compare.getPublisher(), body.getPublisher()); - assertNotNull(compare.getCreators()); - assertNotNull(body.getCreators()); - assertEquals(compare.getCreators().size(), body.getCreators().size()); - final CreatorDto creator0 = body.getCreators().get(0); - assertEquals(compare.getCreators().get(0).getFirstname(), creator0.getFirstname()); - assertEquals(compare.getCreators().get(0).getLastname(), creator0.getLastname()); - assertEquals(compare.getCreators().get(0).getCreatorName(), creator0.getCreatorName()); - assertEquals(compare.getCreators().get(0).getAffiliation(), creator0.getAffiliation()); - assertEquals(compare.getCreators().get(0).getAffiliationIdentifier(), creator0.getAffiliationIdentifier()); - assertEquals(compare.getCreators().get(0).getAffiliationIdentifierScheme(), creator0.getAffiliationIdentifierScheme()); - assertEquals(compare.getCreators().get(0).getNameIdentifier(), creator0.getNameIdentifier()); - assertEquals(compare.getCreators().get(0).getNameIdentifierScheme(), creator0.getNameIdentifierScheme()); - } - - @Test - @WithAnonymousUser - public void find_csv_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/csv"; - final InputStreamResource compare = new InputStreamResource(FileUtils.openInputStream(new File("src/test/resources/csv/keyboard.csv"))); - final InputStreamResource mock = new InputStreamResource(FileUtils.openInputStream(new File("src/test/resources/csv/keyboard.csv"))); - - /* mock */ - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1); - when(identifierService.exportResource(IDENTIFIER_1_ID)) - .thenReturn(mock); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final InputStreamResource body = (InputStreamResource) response.getBody(); - assertNotNull(body); - assertEquals(inputStreamToString(compare.getInputStream()), inputStreamToString(body.getInputStream())); - } - - @Test - @Disabled("not testable with xml") - public void find_xml0_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/xml"; - final InputStreamResource compare = new InputStreamResource(FileUtils.openInputStream(new File("src/test/resources/xml/metadata0.xml"))); - - /* mock */ - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final InputStreamResource body = (InputStreamResource) response.getBody(); - assertNotNull(body); - assertEquals(inputStreamToString(compare.getInputStream()), inputStreamToString(body.getInputStream())); - } - - @Test - @Disabled("not testable with xml") - public void find_xml1_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/xml"; - final InputStreamResource compare = new InputStreamResource(FileUtils.openInputStream(new File("src/test/resources/xml/metadata1.xml"))); - - /* mock */ - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final InputStreamResource body = (InputStreamResource) response.getBody(); - assertNotNull(body); - assertEquals(inputStreamToString(body.getInputStream()), inputStreamToString(compare.getInputStream())); - - } - - @Test - @WithAnonymousUser - public void find_bibliography_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_apa1.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.APA)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyApa0_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=apa"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_apa0.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_4_ID, BibliographyTypeDto.APA)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_4_ID)) - .thenReturn(IDENTIFIER_4); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_4_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyApa1_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=apa"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_apa1.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.APA)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyApa2_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=apa"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_apa2.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_2_ID, BibliographyTypeDto.APA)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_2_ID)) - .thenReturn(IDENTIFIER_2); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_2_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyApa3_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=apa"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_apa3.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_3_ID, BibliographyTypeDto.APA)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_3_ID)) - .thenReturn(IDENTIFIER_3); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_3_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyApa4_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=apa"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_apa4.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.APA)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1_WITH_DOI); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyIeee0_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=ieee"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_ieee0.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_4_ID, BibliographyTypeDto.IEEE)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_4_ID)) - .thenReturn(IDENTIFIER_4); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_4_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyIeee1_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=ieee"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_ieee1.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.IEEE)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyIeee2_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=ieee"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_ieee2.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_2_ID, BibliographyTypeDto.IEEE)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_2_ID)) - .thenReturn(IDENTIFIER_2); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_2_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyIeee3_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=ieee"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_ieee3.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.IEEE)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1_WITH_DOI); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyBibtex0_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=bibtex"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_bibtex0.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_4_ID, BibliographyTypeDto.BIBTEX)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_4_ID)) - .thenReturn(IDENTIFIER_4); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_4_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyBibtex1_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=bibtex"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_bibtex1.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.BIBTEX)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyBibtex2_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=bibtex"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_bibtex2.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_2_ID, BibliographyTypeDto.BIBTEX)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_2_ID)) - .thenReturn(IDENTIFIER_2); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_2_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void find_bibliographyBibtex3_succeeds() throws IdentifierNotFoundException, QueryNotFoundException, - RemoteUnavailableException, IdentifierRequestException, IOException { - final String accept = "text/bibliography; style=bibtex"; - final String compare = FileUtils.readFileToString(new File("src/test/resources/bibliography/style_bibtex3.txt"), - StandardCharsets.UTF_8); - - /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.BIBTEX)) - .thenReturn(compare); - when(identifierService.find(IDENTIFIER_1_ID)) - .thenReturn(IDENTIFIER_1_WITH_DOI); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.find(IDENTIFIER_1_ID, accept); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final String body = (String) response.getBody(); - assertNotNull(body); - assertEquals(compare, body); - } - - @Test - @WithAnonymousUser - public void update_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - generic_update(IDENTIFIER_3_ID, IDENTIFIER_3, IDENTIFIER_3_DTO_UPDATE_REQUEST, null, null, null); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME, authorities = {}) - public void update_noRole_fails() { - - /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - generic_update(IDENTIFIER_3_ID, IDENTIFIER_3, IDENTIFIER_3_DTO_UPDATE_REQUEST, USER_4_USERNAME, USER_4, USER_4_PRINCIPAL); - }); - } - - @Test - @WithMockUser(username = USER_3_USERNAME, authorities = {"modify-identifier-metadata"}) - public void update_hasRoleNoAccess_succeeds() throws UserNotFoundException, NotAllowedException, - IdentifierNotFoundException, IdentifierRequestException, QueryNotFoundException, DatabaseNotFoundException, - RemoteUnavailableException { - - /* test */ - generic_update(IDENTIFIER_3_ID, IDENTIFIER_3, IDENTIFIER_3_DTO_UPDATE_REQUEST, USER_3_USERNAME, USER_3, USER_3_PRINCIPAL); - } - - @Test - @WithMockUser(username = USER_3_USERNAME, authorities = {"modify-identifier-metadata"}) - public void update_hasRoleHasAccess_succeeds() throws IdentifierNotFoundException, IdentifierRequestException, - UserNotFoundException, at.tuwien.exception.AccessDeniedException, NotAllowedException, - QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException { - - /* mock */ - when(accessService.find(IDENTIFIER_3_DATABASE_ID, USER_3_ID)) - .thenReturn(DATABASE_3_USER_3_READ_ACCESS); - - /* test */ - generic_update(IDENTIFIER_3_ID, IDENTIFIER_3, IDENTIFIER_3_DTO_UPDATE_REQUEST, USER_3_USERNAME, USER_3, USER_3_PRINCIPAL); - } - - @Test - @WithAnonymousUser - public void delete_anonymous_fails() { - - /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - this.generic_delete(IDENTIFIER_1_ID, IDENTIFIER_1); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {}) - public void delete_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - this.generic_delete(IDENTIFIER_1_ID, IDENTIFIER_1); - }); - } - - @Test - @WithMockUser(username = USER_2_USERNAME, authorities = {"delete-identifier"}) - public void delete_hasRole_succeeds() throws NotAllowedException, IdentifierNotFoundException { - - /* test */ - this.generic_delete(IDENTIFIER_1_ID, IDENTIFIER_1); - } - - /* ################################################################################################### */ - /* ## GENERIC TEST CASES ## */ - /* ################################################################################################### */ - - protected static String inputStreamToString(InputStream inputStream) throws IOException { - return IOUtils.toString(inputStream, StandardCharsets.UTF_8); - } - - protected void generic_update(Long id, Identifier identifier, IdentifierSaveDto data, String username, User user, - Principal principal) throws IdentifierNotFoundException, IdentifierRequestException, - UserNotFoundException, NotAllowedException, QueryNotFoundException, DatabaseNotFoundException, - RemoteUnavailableException { - - /* mock */ - if (identifier != null) { - when(identifierService.update(id, data, principal, "Bearer abc")) - .thenReturn(identifier); - when(identifierService.find(id)) - .thenReturn(identifier); - } else { - doThrow(IdentifierNotFoundException.class) - .when(identifierService) - .find(id); - } - if (user != null) { - when(userService.findByUsername(username)) - .thenReturn(user); - } else { - doThrow(UserNotFoundException.class) - .when(userService) - .findByUsername(username); - } - - /* test */ - final ResponseEntity<IdentifierDto> response = persistenceEndpoint.update(id, data, "Bearer abc", principal); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - final IdentifierDto body = response.getBody(); - assertNotNull(body); - assertEquals(IDENTIFIER_3_ID, body.getId()); - assertEquals(1, body.getTitles().size()); - assertEquals(IDENTIFIER_3_TITLE_1_TITLE, body.getTitles().get(0).getTitle()); - assertEquals(IDENTIFIER_3_TITLE_1_LANG_DTO, body.getTitles().get(0).getLanguage()); - assertEquals(1, body.getDescriptions().size()); - assertEquals(IDENTIFIER_3_DESCRIPTION_1_DESCRIPTION, body.getDescriptions().get(0).getDescription()); - assertEquals(IDENTIFIER_3_DESCRIPTION_1_LANG_DTO, body.getDescriptions().get(0).getLanguage()); - assertEquals(IDENTIFIER_3_QUERY, body.getQuery()); - assertEquals(IDENTIFIER_3_QUERY_HASH, body.getQueryHash()); - assertEquals(IDENTIFIER_3_RESULT_NUMBER, body.getResultNumber()); - assertEquals(IDENTIFIER_3_RESULT_HASH, body.getResultHash()); - } - - protected void generic_delete(Long id, Identifier identifier) throws IdentifierNotFoundException, NotAllowedException { - - /* mock */ - when(identifierService.find(id)) - .thenReturn(identifier); - doNothing() - .when(identifierService) - .delete(id); - - /* test */ - final ResponseEntity<?> response = persistenceEndpoint.delete(id); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - assertNull(response.getBody()); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/SwaggerComponentTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/SwaggerComponentTest.java deleted file mode 100644 index 3d47518508..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/endpoint/SwaggerComponentTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@Log4j2 -@ExtendWith(SpringExtension.class) -@AutoConfigureMockMvc -@SpringBootTest -public class SwaggerComponentTest extends BaseUnitTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private IdentifierIdxRepository identifierIdxRepository; - - @Test - public void swaggerUi_succeeds() throws Exception { - this.mockMvc.perform(get("/swagger-ui/index.html")) - .andDo(print()) - .andExpect(status().isOk()); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/gateway/QueryServiceGatewayUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/gateway/QueryServiceGatewayUnitTest.java deleted file mode 100644 index f8625b44eb..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/gateway/QueryServiceGatewayUnitTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package at.tuwien.gateway; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.database.query.QueryDto; -import at.tuwien.exception.QueryNotFoundException; -import at.tuwien.exception.RemoteUnavailableException; -import at.tuwien.repository.mdb.UserRepository; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import com.google.common.io.Files; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.web.client.ResourceAccessException; -import org.springframework.web.client.RestTemplate; - -import java.io.File; -import java.io.IOException; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; - -@Log4j2 -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class QueryServiceGatewayUnitTest extends BaseUnitTest { - - @MockBean - private IdentifierIdxRepository identifierIdxRepository; - - @MockBean - @Qualifier("restTemplate") - private RestTemplate restTemplate; - - @MockBean - private UserRepository userRepository; - - @Autowired - private QueryServiceGateway queryServiceGateway; - - @Test - public void find_succeeds() throws QueryNotFoundException, RemoteUnavailableException { - final ResponseEntity<QueryDto> mock = ResponseEntity.status(HttpStatus.ACCEPTED) - .body(QUERY_1_DTO); - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(QueryDto.class))) - .thenReturn(mock); - - /* test */ - final QueryDto response = queryServiceGateway.find(DATABASE_1_ID, IDENTIFIER_1_DTO_REQUEST, null); - assertNotNull(response); - assertEquals(QUERY_1_ID, response.getId()); - } - - @Test - public void find_notFound_fails() { - final ResponseEntity<QueryDto> mock = ResponseEntity.status(HttpStatus.NOT_FOUND) - .build(); - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(QueryDto.class))) - .thenReturn(mock); - - /* test */ - assertThrows(QueryNotFoundException.class, () -> { - queryServiceGateway.find(DATABASE_1_ID, IDENTIFIER_1_DTO_REQUEST, null); - }); - } - - @Test - public void find_notAvailable_fails() { - final ResponseEntity<QueryDto> mock = ResponseEntity.status(HttpStatus.NOT_FOUND) - .build(); - - /* mock */ - doThrow(ResourceAccessException.class) - .when(restTemplate) - .exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(QueryDto.class)); - - /* test */ - assertThrows(RemoteUnavailableException.class, () -> { - queryServiceGateway.find(DATABASE_1_ID, IDENTIFIER_1_DTO_REQUEST, null); - }); - } - - @Test - public void find_notAuthorized_fails() { - final ResponseEntity<QueryDto> mock = ResponseEntity.status(HttpStatus.UNAUTHORIZED) - .build(); - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(QueryDto.class))) - .thenReturn(mock); - - /* test */ - assertThrows(RemoteUnavailableException.class, () -> { - queryServiceGateway.find(DATABASE_1_ID, IDENTIFIER_1_DTO_REQUEST, null); - }); - } - - @Test - public void export_succeeds() throws IOException, QueryNotFoundException, RemoteUnavailableException { - final byte[] bytes = Files.toByteArray(new File("src/test/resources/csv/testdata.csv")); - final ResponseEntity<byte[]> mock = ResponseEntity.status(HttpStatus.OK) - .body(bytes); - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(byte[].class))) - .thenReturn(mock); - - /* test */ - final byte[] response = queryServiceGateway.export(DATABASE_1_ID, QUERY_1_ID); - assertNotNull(response); - assertEquals(bytes, response); - } - - @Test - public void export_notFound_fails() { - final ResponseEntity<byte[]> mock = ResponseEntity.status(HttpStatus.NOT_FOUND) - .build(); - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(byte[].class))) - .thenReturn(mock); - - /* test */ - assertThrows(QueryNotFoundException.class, () -> { - queryServiceGateway.export(DATABASE_1_ID, QUERY_1_ID); - }); - } - - @Test - public void export_notAuthorized_fails() { - final ResponseEntity<byte[]> mock = ResponseEntity.status(HttpStatus.UNAUTHORIZED) - .build(); - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(byte[].class))) - .thenReturn(mock); - - /* test */ - assertThrows(RemoteUnavailableException.class, () -> { - queryServiceGateway.export(DATABASE_1_ID, QUERY_1_ID); - }); - } - - @Test - public void export_notAvailable_succeeds() { - - /* mock */ - doThrow(ResourceAccessException.class) - .when(restTemplate) - .exchange(anyString(), eq(HttpMethod.GET), any(HttpEntity.class), eq(byte[].class)); - - /* test */ - assertThrows(RemoteUnavailableException.class, () -> { - queryServiceGateway.export(DATABASE_1_ID, QUERY_1_ID); - }); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceIntegrationTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceIntegrationTest.java deleted file mode 100644 index 60251377f0..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceIntegrationTest.java +++ /dev/null @@ -1,120 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.datacite.DataCiteBody; -import at.tuwien.api.datacite.DataCiteData; -import at.tuwien.api.datacite.doi.DataCiteDoi; -import at.tuwien.api.identifier.IdentifierSaveDto; -import at.tuwien.config.DataCiteConfig; -import at.tuwien.config.EndpointConfig; -import at.tuwien.entities.identifier.Identifier; -import at.tuwien.exception.*; -import at.tuwien.repository.mdb.*; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import at.tuwien.service.impl.IdentifierServiceImpl; -import org.apache.http.auth.BasicUserPrincipal; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Answers; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.web.client.RestTemplate; - -import java.security.Principal; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.when; - -@ExtendWith(SpringExtension.class) -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@SpringBootTest(properties = "spring.profiles.active:local,doi") -public class DataCiteIdentifierServiceIntegrationTest extends BaseUnitTest { - - @MockBean(answer = Answers.RETURNS_MOCKS) - private DataCiteConfig dataCiteConfig; - - @MockBean(answer = Answers.RETURNS_MOCKS) - private EndpointConfig endpointConfig; - - @MockBean - private IdentifierIdxRepository identifierIdxRepository; - - @Autowired - private LicenseRepository licenseRepository; - - @Autowired - private ImageRepository imageRepository; - - @Autowired - private ContainerRepository containerRepository; - - @Autowired - private DatabaseRepository databaseRepository; - - @Autowired - private IdentifierRepository identifierRepository; - - @Autowired - private RealmRepository realmRepository; - - @Autowired - private UserRepository userRepository; - - @MockBean - @Qualifier("restTemplate") - private RestTemplate restTemplate; - - @MockBean(answer = Answers.RETURNS_SELF) - private RestTemplateBuilder restTemplateBuilder; - - @Autowired - private IdentifierServiceImpl identifierService; - - @Autowired - private IdentifierService dataCiteIdentifierService; - - @BeforeEach - public void beforeEach() { - realmRepository.save(REALM_DBREPO); - licenseRepository.save(LICENSE_1); - userRepository.save(USER_1); - imageRepository.save(IMAGE_1); - containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1); - } - - @Test - public void create_database_succeeds() - throws DatabaseNotFoundException, UserNotFoundException, IdentifierAlreadyExistsException, - QueryNotFoundException, IdentifierPublishingNotAllowedException, RemoteUnavailableException, - IdentifierRequestException, ViewNotFoundException { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - final String bearer = "Bearer abcxyz"; - final DataCiteBody<DataCiteDoi> response = - new DataCiteBody<>(new DataCiteData<>(null, "dois", new DataCiteDoi(IDENTIFIER_1_DOI_NOT_NULL))); - - /* mock */ - when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), - any(ParameterizedTypeReference.class))) - .thenReturn(ResponseEntity.status(HttpStatus.CREATED).body(response)); - when(restTemplateBuilder.build()).thenReturn(restTemplate); - - /* test */ - Identifier result = dataCiteIdentifierService.create(IDENTIFIER_1_DTO_REQUEST, principal, bearer); - assertTrue(identifierRepository.existsById(result.getId())); - assertEquals(IDENTIFIER_1_DOI_NOT_NULL, result.getDoi()); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java deleted file mode 100644 index bb6762027a..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServiceUnitTest.java +++ /dev/null @@ -1,228 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.datacite.DataCiteBody; -import at.tuwien.api.datacite.DataCiteData; -import at.tuwien.api.datacite.doi.DataCiteDoi; -import at.tuwien.api.identifier.IdentifierSaveDto; -import at.tuwien.config.DataCiteConfig; -import at.tuwien.config.EndpointConfig; -import at.tuwien.entities.identifier.Identifier; -import at.tuwien.exception.*; -import at.tuwien.repository.mdb.*; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import at.tuwien.service.impl.IdentifierServiceImpl; -import org.apache.http.auth.BasicUserPrincipal; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Answers; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; - -import java.security.Principal; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.when; - -@ExtendWith(SpringExtension.class) -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@SpringBootTest(properties = "spring.profiles.active:local,doi") -public class DataCiteIdentifierServiceUnitTest extends BaseUnitTest { - - @MockBean(answer = Answers.RETURNS_MOCKS) - private DataCiteConfig dataCiteConfig; - - @MockBean(answer = Answers.RETURNS_MOCKS) - private EndpointConfig endpointConfig; - - @MockBean - private IdentifierIdxRepository identifierIdxRepository; - - @Autowired - private LicenseRepository licenseRepository; - - @Autowired - private ImageRepository imageRepository; - - @Autowired - private ContainerRepository containerRepository; - - @Autowired - private DatabaseRepository databaseRepository; - - @Autowired - private IdentifierRepository identifierRepository; - - @Autowired - private RealmRepository realmRepository; - - @Autowired - private UserRepository userRepository; - - @MockBean - @Qualifier("restTemplate") - private RestTemplate restTemplate; - - @MockBean(answer = Answers.RETURNS_SELF) - private RestTemplateBuilder restTemplateBuilder; - - @MockBean - private IdentifierServiceImpl identifierService; - - @Autowired - private IdentifierService dataCiteIdentifierService; - - @BeforeEach - public void beforeEach() { - realmRepository.save(REALM_DBREPO); - licenseRepository.save(LICENSE_1); - userRepository.save(USER_1); - imageRepository.save(IMAGE_1); - containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1); - } - - @Test - public void create_database_succeeds() - throws DatabaseNotFoundException, UserNotFoundException, IdentifierAlreadyExistsException, - QueryNotFoundException, IdentifierPublishingNotAllowedException, RemoteUnavailableException, - IdentifierRequestException, ViewNotFoundException { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - final String bearer = "Bearer abcxyz"; - final DataCiteBody<DataCiteDoi> response = - new DataCiteBody<>(new DataCiteData<>(null, "dois", new DataCiteDoi(IDENTIFIER_1_DOI_NOT_NULL))); - - /* mock */ - when(identifierService.create(any(IdentifierSaveDto.class), eq(principal), eq(bearer))) - .thenAnswer((i) -> identifierRepository.save(IDENTIFIER_1)); - when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), - any(ParameterizedTypeReference.class))) - .thenReturn(ResponseEntity.status(HttpStatus.CREATED).body(response)); - when(restTemplateBuilder.build()).thenReturn(restTemplate); - - /* test */ - Identifier result = dataCiteIdentifierService.create(IDENTIFIER_1_DTO_REQUEST, principal, bearer); - assertTrue(identifierRepository.existsById(result.getId())); - assertEquals(IDENTIFIER_1_DOI_NOT_NULL, result.getDoi()); - } - - @Test - public void create_invalidMetadata_fails() - throws IdentifierAlreadyExistsException, UserNotFoundException, QueryNotFoundException, - DatabaseNotFoundException, RemoteUnavailableException, IdentifierPublishingNotAllowedException, - IdentifierRequestException, ViewNotFoundException { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - final String bearer = "Bearer abcxyz"; - - /* mock */ - when(identifierService.create(any(IdentifierSaveDto.class), eq(principal), eq(bearer))) - .thenAnswer((i) -> identifierRepository.save(IDENTIFIER_1)); - when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), - any(ParameterizedTypeReference.class))) - .thenThrow(HttpClientErrorException.BadRequest.class); - when(restTemplateBuilder.build()).thenReturn(restTemplate); - - /* test */ - assertThrows(IdentifierRequestException.class, () -> { - dataCiteIdentifierService.create(IDENTIFIER_1_DTO_REQUEST, principal, bearer); - }); - assertEquals(0, identifierRepository.count()); - } - - @Test - public void create_restClientException_fails() - throws IdentifierAlreadyExistsException, UserNotFoundException, QueryNotFoundException, - DatabaseNotFoundException, RemoteUnavailableException, IdentifierPublishingNotAllowedException, - IdentifierRequestException, ViewNotFoundException { - final Principal principal = new BasicUserPrincipal(USER_1_USERNAME); - final String bearer = "Bearer abcxyz"; - - /* mock */ - when(identifierService.create(any(IdentifierSaveDto.class), eq(principal), eq(bearer))) - .thenAnswer((i) -> identifierRepository.save(IDENTIFIER_1)); - when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), any(HttpEntity.class), - any(ParameterizedTypeReference.class))) - .thenThrow(RestClientException.class); - when(restTemplateBuilder.build()).thenReturn(restTemplate); - - /* test */ - assertThrows(InternalError.class, () -> { - dataCiteIdentifierService.create(IDENTIFIER_1_DTO_REQUEST, principal, bearer); - }); - assertEquals(0, identifierRepository.count()); - } - - @Test - public void update_existing_succeeds() throws IdentifierRequestException, UserNotFoundException, - QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, IdentifierNotFoundException { - final DataCiteBody<DataCiteDoi> response = - new DataCiteBody<>(new DataCiteData<>(null, "dois", new DataCiteDoi(IDENTIFIER_1_DOI_NOT_NULL))); - - /* mock */ - when(identifierService.update(eq(IDENTIFIER_1_ID), any(IdentifierSaveDto.class), any(Principal.class), anyString())) - .thenAnswer((i) -> identifierRepository.save(IDENTIFIER_1_WITH_DOI)); - when(restTemplate.exchange(anyString(), eq(HttpMethod.PUT), any(HttpEntity.class), - any(ParameterizedTypeReference.class), eq(IDENTIFIER_1_DOI_NOT_NULL))) - .thenReturn(ResponseEntity.ok(response)); - when(restTemplateBuilder.build()).thenReturn(restTemplate); - - /* test */ - Identifier result = dataCiteIdentifierService.update(IDENTIFIER_1_ID, IDENTIFIER_1_DTO_UPDATE_REQUEST, USER_1_PRINCIPAL, "abc"); - assertTrue(identifierRepository.existsById(IDENTIFIER_1_ID)); - assertEquals(IDENTIFIER_1_DOI_NOT_NULL, result.getDoi()); - } - - @Test - public void update_invalidMetadata_fails() throws UserNotFoundException, QueryNotFoundException, - DatabaseNotFoundException, RemoteUnavailableException, IdentifierNotFoundException { - - /* mock */ - when(identifierService.update(eq(IDENTIFIER_1_ID), any(IdentifierSaveDto.class), any(Principal.class), anyString())) - .thenAnswer((i) -> identifierRepository.save(IDENTIFIER_1_WITH_DOI)); - when(restTemplate.exchange(anyString(), eq(HttpMethod.PUT), any(HttpEntity.class), - any(ParameterizedTypeReference.class), eq(IDENTIFIER_1_DOI_NOT_NULL))) - .thenThrow(HttpClientErrorException.BadRequest.class); - when(restTemplateBuilder.build()).thenReturn(restTemplate); - - /* test */ - assertThrows(IdentifierRequestException.class, () -> { - dataCiteIdentifierService.update(IDENTIFIER_1_ID, IDENTIFIER_1_DTO_UPDATE_REQUEST, USER_1_PRINCIPAL, "abc"); - }); - assertEquals(0, identifierRepository.count()); - } - - @Test - public void update_restClientException_fails() throws UserNotFoundException, QueryNotFoundException, - DatabaseNotFoundException, RemoteUnavailableException, IdentifierNotFoundException { - - /* mock */ - when(identifierService.update(eq(IDENTIFIER_1_ID), any(IdentifierSaveDto.class), any(Principal.class), anyString())) - .thenAnswer((i) -> identifierRepository.save(IDENTIFIER_1_WITH_DOI)); - when(restTemplate.exchange(anyString(), eq(HttpMethod.PUT), any(HttpEntity.class), - any(ParameterizedTypeReference.class), eq(IDENTIFIER_1_DOI_NOT_NULL))) - .thenThrow(RestClientException.class); - when(restTemplateBuilder.build()).thenReturn(restTemplate); - - /* test */ - assertThrows(InternalError.class, () -> { - dataCiteIdentifierService.update(IDENTIFIER_1_ID, IDENTIFIER_1_DTO_UPDATE_REQUEST, USER_1_PRINCIPAL, "abc"); - }); - assertEquals(0, identifierRepository.count()); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java deleted file mode 100644 index 3f9373e272..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.entities.database.Database; -import at.tuwien.exception.DatabaseNotFoundException; -import at.tuwien.repository.mdb.*; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; - - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -@ExtendWith(SpringExtension.class) -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@SpringBootTest -public class DatabaseServiceIntegrationTest extends BaseUnitTest { - - @MockBean - private IdentifierIdxRepository identifierIdxRepository; - - @Autowired - private DatabaseService databaseService; - - @Autowired - private UserRepository userRepository; - - @Autowired - private RealmRepository realmRepository; - - @Autowired - private ContainerRepository containerRepository; - - @Autowired - private DatabaseRepository databaseRepository; - - @Autowired - private ImageRepository imageRepository; - - @BeforeEach - public void beforeEach() { - userRepository.save(USER_1); - realmRepository.save(REALM_DBREPO); - imageRepository.save(IMAGE_1); - containerRepository.save(CONTAINER_1); - databaseRepository.save(DATABASE_1); - } - - @Test - public void find_succeeds() throws DatabaseNotFoundException { - - /* test */ - final Database response = databaseService.find(DATABASE_1_ID); - assertEquals(DATABASE_1_ID, response.getId()); - } - - @Test - public void find_fails() { - - /* test */ - assertThrows(DatabaseNotFoundException.class, () -> { - databaseService.find(9999L); - }); - } - - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java deleted file mode 100644 index 5b40a26704..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceIntegrationTest.java +++ /dev/null @@ -1,406 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.database.query.QueryDto; -import at.tuwien.api.identifier.IdentifierSaveDto; -import at.tuwien.entities.identifier.Identifier; -import at.tuwien.entities.identifier.IdentifierDescription; -import at.tuwien.entities.identifier.IdentifierTitle; -import at.tuwien.entities.identifier.RelatedIdentifier; -import at.tuwien.exception.*; -import at.tuwien.gateway.QueryServiceGateway; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import at.tuwien.repository.mdb.*; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.opensearch.testcontainers.OpensearchContainer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.DynamicPropertyRegistry; -import org.springframework.test.context.DynamicPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.client.RestTemplate; -import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; -import org.testcontainers.utility.DockerImageName; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.when; - -@Log4j2 -@Testcontainers -@ExtendWith(SpringExtension.class) -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@SpringBootTest -public class IdentifierServiceIntegrationTest extends BaseUnitTest { - - @MockBean - private QueryServiceGateway queryServiceGateway; - - @MockBean - @Qualifier("restTemplate") - private RestTemplate restTemplate; - - @Autowired - private LicenseRepository licenseRepository; - - @Autowired - private IdentifierService identifierService; - - @Autowired - private IdentifierRepository identifierRepository; - - @Autowired - private IdentifierIdxRepository identifierIdxRepository; - - @Autowired - private IdentifierTitleRepository identifierTitleRepository; - - @Autowired - private IdentifierDescriptionRepository identifierDescriptionRepository; - - @Autowired - private ContainerRepository containerRepository; - - @Autowired - private DatabaseRepository databaseRepository; - - @Autowired - private ImageRepository imageRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private ViewRepository viewRepository; - - @Autowired - private TableRepository tableRepository; - - @Autowired - private RealmRepository realmRepository; - - @Container - private static final OpensearchContainer opensearchContainer = new OpensearchContainer(DockerImageName.parse("opensearchproject/opensearch:2.8.0")); - - @DynamicPropertySource - static void elasticsearchProperties(DynamicPropertyRegistry registry) { - final int idx = opensearchContainer.getHttpHostAddress().lastIndexOf(':'); - registry.add("spring.opensearch.host", () -> "127.0.0.1"); - registry.add("spring.opensearch.port", () -> opensearchContainer.getHttpHostAddress().substring(idx + 1)); - registry.add("spring.opensearch.username", opensearchContainer::getUsername); - registry.add("spring.opensearch.password", opensearchContainer::getPassword); - } - - @BeforeEach - public void beforeEach() { - imageRepository.save(IMAGE_1_SIMPLE); - realmRepository.save(REALM_DBREPO); - licenseRepository.save(LICENSE_1); - userRepository.save(USER_1_SIMPLE); - userRepository.save(USER_2_SIMPLE); - userRepository.save(USER_3_SIMPLE); - userRepository.save(USER_4_SIMPLE); - containerRepository.save(CONTAINER_1_SIMPLE); - databaseRepository.save(DATABASE_1_SIMPLE); - containerRepository.save(CONTAINER_2_SIMPLE); - databaseRepository.save(DATABASE_2_SIMPLE); - } - - @Test - public void create_subsetRelatedIdentifiers_succeeds() - throws DatabaseNotFoundException, UserNotFoundException, IdentifierAlreadyExistsException, - QueryNotFoundException, IdentifierPublishingNotAllowedException, RemoteUnavailableException, - IdentifierRequestException, ViewNotFoundException { - final String bearer = "Bearer abcxyz"; - - /* mock */ - when(restTemplate.exchange(anyString(), any(HttpMethod.class), any(HttpEntity.class), eq(QueryDto.class))) - .thenReturn(ResponseEntity.ok(QUERY_2_DTO)); - when(queryServiceGateway.find(DATABASE_2_ID, IDENTIFIER_2_DTO_REQUEST, bearer)) - .thenReturn(QUERY_2_DTO); - identifierRepository.save(IDENTIFIER_1_SIMPLE); - - /* test */ - final Identifier response = identifierService.create(IDENTIFIER_2_DTO_REQUEST, USER_2_PRINCIPAL, bearer); - assertEquals(IDENTIFIER_2_ID, response.getId()); - assertNotNull(response.getTitles()); - assertEquals(1, response.getTitles().size()); - final IdentifierTitle title0 = response.getTitles().get(0); - assertEquals(IDENTIFIER_2_TITLE_1_TITLE, title0.getTitle()); - assertEquals(IDENTIFIER_2_TITLE_1_LANG, title0.getLanguage()); - assertEquals(IDENTIFIER_2_TITLE_1_TYPE, title0.getTitleType()); - assertNotNull(response.getDescriptions()); - assertEquals(1, response.getDescriptions().size()); - final IdentifierDescription description0 = response.getDescriptions().get(0); - assertEquals(IDENTIFIER_2_DESCRIPTION_1_DESCRIPTION, description0.getDescription()); - assertEquals(IDENTIFIER_2_DESCRIPTION_1_LANG, description0.getLanguage()); - assertEquals(IDENTIFIER_2_DESCRIPTION_1_TYPE, description0.getDescriptionType()); - assertEquals(IDENTIFIER_2_DOI, response.getDoi()); - assertEquals(IDENTIFIER_2_PUBLISHER, response.getPublisher()); - assertEquals(IDENTIFIER_2_DATABASE_ID, response.getDatabase().getId()); - assertNull(response.getLanguage()); - assertEquals(IDENTIFIER_2_PUBLICATION_YEAR, response.getPublicationYear()); - assertEquals(IDENTIFIER_2_PUBLICATION_MONTH, response.getPublicationMonth()); - assertEquals(IDENTIFIER_2_PUBLICATION_DAY, response.getPublicationDay()); - final List<RelatedIdentifier> relatedIdentifiers = response.getRelatedIdentifiers(); - assertEquals(1, relatedIdentifiers.size()); - final RelatedIdentifier relatedIdentifier1 = relatedIdentifiers.get(0); - assertEquals(RELATED_IDENTIFIER_2_ID, relatedIdentifier1.getId()); - assertEquals(RELATED_IDENTIFIER_2_TYPE, relatedIdentifier1.getType()); - assertEquals(RELATED_IDENTIFIER_2_RELATION_TYPE, relatedIdentifier1.getRelation()); - assertEquals(RELATED_IDENTIFIER_2_VALUE, relatedIdentifier1.getValue()); - /* open search database */ - assertTrue(identifierIdxRepository.existsById(IDENTIFIER_2_ID)); - } - - @Test - public void create_succeeds() throws DatabaseNotFoundException, UserNotFoundException, - IdentifierAlreadyExistsException, QueryNotFoundException, IdentifierPublishingNotAllowedException, - RemoteUnavailableException, IdentifierRequestException, ViewNotFoundException { - final String bearer = "Bearer abcxyz"; - - /* test */ - final Identifier response = identifierService.create(IDENTIFIER_1_DTO_REQUEST, USER_1_PRINCIPAL, bearer); - assertEquals(IDENTIFIER_1_ID, response.getId()); - assertNotNull(response.getTitles()); - final List<IdentifierTitle> titles = response.getTitles(); - assertEquals(2, titles.size()); - final IdentifierTitle title0 = titles.get(0); - assertEquals(IDENTIFIER_1_TITLE_1_ID, title0.getId()); - assertEquals(IDENTIFIER_1_TITLE_1_TITLE, title0.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_1_LANG, title0.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_1_TYPE, title0.getTitleType()); - final IdentifierTitle title1 = titles.get(1); - assertEquals(IDENTIFIER_1_TITLE_2_ID, title1.getId()); - assertEquals(IDENTIFIER_1_TITLE_2_TITLE, title1.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_2_LANG, title1.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_2_TYPE, title1.getTitleType()); - assertNotNull(response.getDescriptions()); - assertEquals(1, response.getDescriptions().size()); - final List<IdentifierDescription> descriptions = response.getDescriptions(); - final IdentifierDescription description0 = descriptions.get(0); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_DESCRIPTION, description0.getDescription()); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_LANG, description0.getLanguage()); - assertEquals(IDENTIFIER_1_DESCRIPTION_1_TYPE, description0.getDescriptionType()); - assertNotNull(response.getCreators()); - assertEquals(1, response.getCreators().size()); - assertNotNull(response.getFunders()); - assertEquals(1, response.getFunders().size()); - /* open search database */ - assertTrue(identifierIdxRepository.existsById(IDENTIFIER_1_ID)); - } - - @Test - public void create_noRelatedTitleDescription_succeeds() throws DatabaseNotFoundException, UserNotFoundException, - IdentifierAlreadyExistsException, QueryNotFoundException, IdentifierPublishingNotAllowedException, - RemoteUnavailableException, IdentifierRequestException, ViewNotFoundException { - final String bearer = "Bearer abcxyz"; - - /* mock */ - containerRepository.save(CONTAINER_3_SIMPLE); - containerRepository.save(CONTAINER_4_SIMPLE); - databaseRepository.save(DATABASE_3_SIMPLE); - databaseRepository.save(DATABASE_4_SIMPLE); - identifierRepository.save(IDENTIFIER_1_SIMPLE); - identifierRepository.save(IDENTIFIER_2_SIMPLE); - identifierRepository.save(IDENTIFIER_3_SIMPLE); - identifierIdxRepository.save(IDENTIFIER_1_DTO); - identifierIdxRepository.save(IDENTIFIER_2_DTO); - identifierIdxRepository.save(IDENTIFIER_3_DTO); - - /* test */ - final Identifier response = identifierService.create(IDENTIFIER_4_DTO_REQUEST, USER_1_PRINCIPAL, bearer); - assertEquals(IDENTIFIER_4_ID, response.getId()); - assertNotNull(response.getTitles()); - assertEquals(0, response.getTitles().size()); - assertNotNull(response.getDescriptions()); - assertEquals(0, response.getDescriptions().size()); - assertNotNull(response.getCreators()); - assertEquals(1, response.getCreators().size()); - assertNotNull(response.getFunders()); - assertEquals(0, response.getFunders().size()); - /* open search database */ - assertTrue(identifierIdxRepository.existsById(IDENTIFIER_4_ID)); - } - - @Test - public void create_subsetHasDatabaseIdentifier_succeeds() throws DatabaseNotFoundException, UserNotFoundException, - IdentifierAlreadyExistsException, QueryNotFoundException, IdentifierPublishingNotAllowedException, - RemoteUnavailableException, IdentifierRequestException, ViewNotFoundException { - final String authorization = "Bearer abcxyz"; - - /* mock */ - containerRepository.save(CONTAINER_3_SIMPLE); - containerRepository.save(CONTAINER_4_SIMPLE); - databaseRepository.save(DATABASE_3_SIMPLE); - databaseRepository.save(DATABASE_4_SIMPLE); - identifierRepository.save(IDENTIFIER_1_SIMPLE); - identifierRepository.save(IDENTIFIER_2_SIMPLE); - identifierRepository.save(IDENTIFIER_3_SIMPLE); - identifierRepository.save(IDENTIFIER_4_SIMPLE); - identifierIdxRepository.save(IDENTIFIER_1_DTO); - identifierIdxRepository.save(IDENTIFIER_2_DTO); - identifierIdxRepository.save(IDENTIFIER_3_DTO); - identifierIdxRepository.save(IDENTIFIER_4_DTO); - when(queryServiceGateway.find(DATABASE_1_ID, IDENTIFIER_5_DTO_REQUEST, authorization)) - .thenReturn(QUERY_1_DTO); - - /* test */ - final Identifier response = identifierService.create(IDENTIFIER_5_DTO_REQUEST, USER_1_PRINCIPAL, authorization); - assertEquals(IDENTIFIER_5_DATABASE_ID, response.getDatabaseId()); - assertEquals(IDENTIFIER_5_DATABASE_ID, response.getDatabase().getId()); - assertEquals(IDENTIFIER_5_QUERY, response.getQuery()); - assertEquals(IDENTIFIER_5_QUERY_HASH, response.getQueryHash()); - assertEquals(IDENTIFIER_5_RESULT_HASH, response.getResultHash()); - assertEquals(0, response.getTitles().size()); - assertEquals(0, response.getDescriptions().size()); - /* open search database */ - assertTrue(identifierIdxRepository.existsById(IDENTIFIER_5_ID)); - } - - @Test - public void create_viewIdentifier_succeeds() throws DatabaseNotFoundException, UserNotFoundException, - IdentifierAlreadyExistsException, QueryNotFoundException, IdentifierPublishingNotAllowedException, - RemoteUnavailableException, IdentifierRequestException, ViewNotFoundException { - final String authorization = "Bearer abcxyz"; - - /* mock */ - containerRepository.save(CONTAINER_3_SIMPLE); - containerRepository.save(CONTAINER_4_SIMPLE); - databaseRepository.save(DATABASE_3_SIMPLE); - databaseRepository.save(DATABASE_4_SIMPLE); - tableRepository.saveAll(List.of(TABLE_1_SIMPLE, TABLE_2_SIMPLE, TABLE_3_SIMPLE)); - viewRepository.save(VIEW_1); - identifierRepository.save(IDENTIFIER_1_SIMPLE); - identifierRepository.save(IDENTIFIER_2_SIMPLE); - identifierRepository.save(IDENTIFIER_3_SIMPLE); - identifierRepository.save(IDENTIFIER_4_SIMPLE); - identifierRepository.save(IDENTIFIER_5_SIMPLE); - identifierIdxRepository.save(IDENTIFIER_1_DTO); - identifierIdxRepository.save(IDENTIFIER_2_DTO); - identifierIdxRepository.save(IDENTIFIER_3_DTO); - identifierIdxRepository.save(IDENTIFIER_4_DTO); - identifierIdxRepository.save(IDENTIFIER_5_DTO); - - /* test */ - final Identifier response = identifierService.create(IDENTIFIER_6_DTO_REQUEST, USER_1_PRINCIPAL, authorization); - assertEquals(IDENTIFIER_6_DATABASE_ID, response.getDatabaseId()); - assertEquals(IDENTIFIER_6_DATABASE_ID, response.getDatabase().getId()); - assertEquals(IDENTIFIER_6_QUERY, response.getQuery()); - assertEquals(IDENTIFIER_6_QUERY_HASH, response.getQueryHash()); - assertEquals(IDENTIFIER_6_RESULT_HASH, response.getResultHash()); - assertEquals(0, response.getTitles().size()); - assertEquals(0, response.getDescriptions().size()); - assertEquals(1, response.getLicenses().size()); - /* open search database */ - assertTrue(identifierIdxRepository.existsById(IDENTIFIER_6_ID)); - } - - @Test - public void find_fails() { - - /* mock */ - identifierRepository.save(IDENTIFIER_1_SIMPLE); - - /* test */ - assertThrows(IdentifierNotFoundException.class, () -> { - identifierService.find(IDENTIFIER_2_ID); - }); - } - - @Test - public void update_database_succeeds() throws UserNotFoundException, QueryNotFoundException, - DatabaseNotFoundException, RemoteUnavailableException, IdentifierRequestException, - IdentifierNotFoundException { - - /* mock */ - identifierRepository.save(IDENTIFIER_1_SIMPLE); - - /* test */ - final Identifier response = identifierService.update(IDENTIFIER_1_ID, IDENTIFIER_1_DTO_UPDATE_REQUEST, USER_1_PRINCIPAL, "Bearer abc"); - assertEquals(IDENTIFIER_1_ID, response.getId()); - assertEquals(IDENTIFIER_1_DATABASE_ID, response.getDatabaseId()); - final List<IdentifierTitle> titles = response.getTitles(); - assertEquals(2, titles.size()); - final IdentifierTitle title0 = titles.get(0); - assertEquals(IDENTIFIER_1_TITLE_1_ID, title0.getId()); - assertEquals(IDENTIFIER_1_TITLE_1_TITLE_MODIFY, title0.getTitle()); // <<<<<< - assertEquals(IDENTIFIER_1_TITLE_1_LANG, title0.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_1_TYPE, title0.getTitleType()); - final IdentifierTitle title1 = titles.get(1); - assertEquals(IDENTIFIER_1_TITLE_2_ID, title1.getId()); - assertEquals(IDENTIFIER_1_TITLE_2_TITLE_MODIFY, title1.getTitle()); - assertEquals(IDENTIFIER_1_TITLE_2_LANG, title1.getLanguage()); - assertEquals(IDENTIFIER_1_TITLE_2_TYPE, title1.getTitleType()); - assertEquals(IDENTIFIER_1_PUBLICATION_YEAR, response.getPublicationYear()); - assertEquals(IDENTIFIER_1_PUBLICATION_MONTH, response.getPublicationMonth()); - assertEquals(IDENTIFIER_1_PUBLICATION_DAY, response.getPublicationDay()); - /* open search database */ - assertTrue(identifierIdxRepository.existsById(IDENTIFIER_1_ID)); - } - - @Test - @Transactional - public void update_subset_succeeds() throws UserNotFoundException, QueryNotFoundException, - DatabaseNotFoundException, RemoteUnavailableException, IdentifierRequestException, - IdentifierNotFoundException { - - /* mock */ - identifierRepository.save(IDENTIFIER_1_SIMPLE); - identifierRepository.save(IDENTIFIER_2_SIMPLE); - when(queryServiceGateway.find(eq(IDENTIFIER_2_DATABASE_ID), any(IdentifierSaveDto.class), anyString())) - .thenReturn(QUERY_2_DTO); - - /* test */ - final Identifier response = identifierService.update(IDENTIFIER_2_ID, IDENTIFIER_2_DTO_UPDATE_REQUEST, USER_2_PRINCIPAL, "Bearer abc"); - assertEquals(IDENTIFIER_2_ID, response.getId()); - assertEquals(IDENTIFIER_2_DATABASE_ID, response.getDatabase().getId()); - assertEquals(1, response.getTitles().size()); - assertEquals(1, identifierRepository.findAll().stream().map(Identifier::getTitles).flatMap(List::stream).toList().size()); - assertEquals(IDENTIFIER_2_PUBLICATION_YEAR, response.getPublicationYear()); - assertEquals(IDENTIFIER_2_PUBLICATION_MONTH, response.getPublicationMonth()); - assertEquals(IDENTIFIER_2_PUBLICATION_DAY, response.getPublicationDay()); - /* open search database */ - assertTrue(identifierIdxRepository.existsById(IDENTIFIER_2_ID)); - } - - @Test - public void delete_succeeds() throws IdentifierNotFoundException { - - /* mock */ - identifierRepository.save(IDENTIFIER_1_SIMPLE); - identifierIdxRepository.save(IDENTIFIER_1_DTO); - - /* test */ - identifierService.delete(IDENTIFIER_1_ID); - assertTrue(userRepository.findById(IDENTIFIER_1_CREATED_BY).isPresent()) /* no cascade of delete */; - /* open search database */ - assertFalse(identifierIdxRepository.existsById(IDENTIFIER_1_ID)); - } - - @Test - public void delete_notFound_fails() { - - /* mock */ - identifierRepository.save(IDENTIFIER_1_SIMPLE); - - /* test */ - assertThrows(IdentifierNotFoundException.class, () -> { - identifierService.delete(IDENTIFIER_2_ID); - }); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceUnitTest.java deleted file mode 100644 index b5961bdc97..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/IdentifierServiceUnitTest.java +++ /dev/null @@ -1,420 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.database.query.QueryDto; -import at.tuwien.api.identifier.BibliographyTypeDto; -import at.tuwien.api.identifier.IdentifierDto; -import at.tuwien.entities.identifier.Creator; -import at.tuwien.entities.identifier.Identifier; -import at.tuwien.entities.identifier.IdentifierType; -import at.tuwien.entities.identifier.NameIdentifierSchemeType; -import at.tuwien.exception.*; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import at.tuwien.repository.mdb.IdentifierRepository; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.web.client.RestTemplate; - -import java.util.List; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.when; - -@ExtendWith(SpringExtension.class) -@SpringBootTest -public class IdentifierServiceUnitTest extends BaseUnitTest { - - @MockBean - private IdentifierRepository identifierRepository; - - @MockBean - private IdentifierIdxRepository identifierIdxRepository; - - @MockBean - private DatabaseService databaseService; - - @MockBean - @Qualifier("restTemplate") - private RestTemplate restTemplate; - - @MockBean - private UserService userService; - - @Autowired - private IdentifierService identifierService; - - @Test - public void findAll_succeeds() { - - /* mock */ - when(identifierRepository.findAll()) - .thenReturn(List.of(IDENTIFIER_1)); - - /* test */ - final List<Identifier> response = identifierService.findAll(null, null, null, null); - assertEquals(1, response.size()); - assertEquals(IDENTIFIER_1, response.get(0)); - } - - @Test - public void findAll2_succeeds() { - - /* mock */ - when(identifierRepository.findAll()) - .thenReturn(List.of(IDENTIFIER_1)); - - /* test */ - final List<Identifier> response = identifierService.findAll(null, null, null, null); - assertEquals(1, response.size()); - assertEquals(IDENTIFIER_1, response.get(0)); - } - - @Test - public void findAll2_databaseId_succeeds() { - - /* mock */ - when(identifierRepository.findAll()) - .thenReturn(List.of(IDENTIFIER_1)); - - /* test */ - final List<Identifier> response = identifierService.findAll(null, DATABASE_1_ID, null, null); - assertEquals(1, response.size()); - assertEquals(IDENTIFIER_1, response.get(0)); - } - - @Test - public void findAll2_queryId_succeeds() { - - /* mock */ - when(identifierRepository.findAll()) - .thenReturn(List.of(IDENTIFIER_1)); - - /* test */ - final List<Identifier> response = identifierService.findAll(null, null, QUERY_1_ID, null); - assertEquals(1, response.size()); - assertEquals(IDENTIFIER_1, response.get(0)); - } - - @Test - public void findAll2_databaseIdAndQueryId_succeeds() { - - /* mock */ - when(identifierRepository.findAll()) - .thenReturn(List.of(IDENTIFIER_1)); - - /* test */ - final List<Identifier> response = identifierService.findAll(null, DATABASE_1_ID, QUERY_1_ID, null); - assertEquals(1, response.size()); - assertEquals(IDENTIFIER_1, response.get(0)); - } - - @Test - public void find_succeeds() throws IdentifierNotFoundException { - - /* mock */ - when(identifierRepository.findById(IDENTIFIER_1_ID)) - .thenReturn(Optional.of(IDENTIFIER_1)); - - /* test */ - final Identifier response = identifierService.find(IDENTIFIER_1_ID); - assertEquals(IDENTIFIER_1, response); - } - - @Test - public void findByDatabaseIdAndQueryId_succeeds() { - - /* mock */ - when(identifierRepository.findByDatabaseIdAndQueryId(DATABASE_1_ID, QUERY_1_ID)) - .thenReturn(List.of(IDENTIFIER_1)); - - /* test */ - final List<Identifier> response = identifierService.findByDatabaseIdAndQueryId(DATABASE_1_ID, QUERY_1_ID); - assertEquals(1, response.size()); - final Identifier identifier0 = response.get(0); - assertEquals(IDENTIFIER_1_ID, identifier0.getId()); - } - - @Test - public void findByDatabaseIdAndQueryId_fails() { - - /* mock */ - when(identifierRepository.findByDatabaseIdAndQueryId(DATABASE_1_ID, QUERY_1_ID)) - .thenReturn(List.of()); - - /* test */ - final List<Identifier> response = identifierService.findByDatabaseIdAndQueryId(DATABASE_1_ID, QUERY_1_ID); - assertEquals(0, response.size()); - } - - @Test - public void find_fails() { - - /* mock */ - when(identifierRepository.findById(IDENTIFIER_1_ID)) - .thenReturn(Optional.empty()); - - /* test */ - assertThrows(IdentifierNotFoundException.class, () -> { - identifierService.find(IDENTIFIER_1_ID); - }); - } - - @Test - public void create_database_succeeds() - throws DatabaseNotFoundException, UserNotFoundException, IdentifierAlreadyExistsException, - QueryNotFoundException, IdentifierPublishingNotAllowedException, RemoteUnavailableException, - IdentifierRequestException, ViewNotFoundException { - final String bearer = "Bearer abcxyz"; - - /* mock */ - when(databaseService.find(DATABASE_1_ID)) - .thenReturn(DATABASE_1); - when(restTemplate.exchange(anyString(), any(HttpMethod.class), any(HttpEntity.class), eq(QueryDto.class))) - .thenReturn(ResponseEntity.ok(QUERY_1_DTO)); - when(userService.findByUsername(USER_1_USERNAME)) - .thenReturn(USER_1); - when(identifierRepository.save(any(Identifier.class))) - .thenReturn(IDENTIFIER_1); - when(identifierIdxRepository.save(any(IdentifierDto.class))) - .thenReturn(IDENTIFIER_1_DTO); - - - /* test */ - identifierService.create(IDENTIFIER_1_DTO_REQUEST, USER_1_PRINCIPAL, bearer); - } - - @Test - public void create_existsSubset_fails() - throws DatabaseNotFoundException { - final String bearer = "Bearer abcxyz"; - - /* mock */ - when(databaseService.find(DATABASE_2_ID)) - .thenReturn(DATABASE_2); - when(identifierRepository.existsByDatabaseIdAndQueryIdAndType(DATABASE_2_ID, QUERY_2_ID, IdentifierType.SUBSET)) - .thenReturn(true); - - - /* test */ - assertThrows(IdentifierAlreadyExistsException.class, () -> { - identifierService.create(IDENTIFIER_2_DTO_REQUEST, USER_1_PRINCIPAL, bearer); - }); - } - - @Test - public void create_existsDatabase_fails() throws DatabaseNotFoundException { - final String bearer = "Bearer abcxyz"; - - /* mock */ - when(databaseService.find(DATABASE_1_ID)) - .thenReturn(DATABASE_1); - when(identifierRepository.existsByDatabaseIdAndType(DATABASE_1_ID, IdentifierType.DATABASE)) - .thenReturn(true); - - - /* test */ - assertThrows(IdentifierAlreadyExistsException.class, () -> { - identifierService.create(IDENTIFIER_1_DTO_REQUEST, USER_1_PRINCIPAL, bearer); - }); - } - - @Test - public void exportBibliography_apa_succeeds() throws IdentifierNotFoundException, IdentifierRequestException { - - /* mock */ - when(identifierRepository.findById(IDENTIFIER_1_ID)) - .thenReturn(Optional.of(IDENTIFIER_1)); - - /* test */ - final String response = identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.APA); - assertTrue(response.contains(IDENTIFIER_1_TITLE_1.getTitle())); - assertTrue(response.contains("" + IDENTIFIER_1_PUBLICATION_YEAR)); - assertTrue(response.contains(IDENTIFIER_1_CREATOR_1.getLastname())); - } - - @Test - public void exportBibliography_apaMixedPersonAndOrg_succeeds() throws IdentifierNotFoundException, - IdentifierRequestException { - final Creator org = Creator.builder() - .id(CREATOR_2_ID) - .creatorName("Institute of Science and Technology Austria") - .nameIdentifier("https://ror.org/03gnh5541") - .nameIdentifierScheme(NameIdentifierSchemeType.ROR) - .build(); - final Identifier identifier = IDENTIFIER_1.toBuilder() - .creators(List.of(IDENTIFIER_1_CREATOR_1, org)) - .build(); - - /* mock */ - when(identifierRepository.findById(IDENTIFIER_1_ID)) - .thenReturn(Optional.of(identifier)); - - /* test */ - final String response = identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.APA); - final String title = IDENTIFIER_1_CREATOR_1.getFirstname().charAt(0) + "., " + IDENTIFIER_1_CREATOR_1.getLastname() + " & Institute of Science and Technology Austria"; - assertTrue(response.contains(title)); - assertTrue(response.contains("" + IDENTIFIER_1_PUBLICATION_YEAR)); - } - - @Test - public void exportBibliography_bibtex_succeeds() throws IdentifierNotFoundException, IdentifierRequestException { - - /* mock */ - when(identifierRepository.findById(IDENTIFIER_1_ID)) - .thenReturn(Optional.of(IDENTIFIER_1)); - - /* test */ - final String response = identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.BIBTEX); - assertTrue(response.contains(IDENTIFIER_1_TITLE_1.getTitle())); - assertTrue(response.contains("" + IDENTIFIER_1_PUBLICATION_YEAR)); - assertTrue(response.contains(IDENTIFIER_1_CREATOR_1.getLastname())); - } - - @Test - public void exportBibliography_bibtexMixedPersonAndOrg_succeeds() throws IdentifierNotFoundException, - IdentifierRequestException { - final Creator org = Creator.builder() - .id(CREATOR_2_ID) - .creatorName("Institute of Science and Technology Austria") - .nameIdentifier("https://ror.org/03gnh5541") - .nameIdentifierScheme(NameIdentifierSchemeType.ROR) - .build(); - final Identifier identifier = IDENTIFIER_1.toBuilder() - .creators(List.of(IDENTIFIER_1_CREATOR_1, org)) - .build(); - - /* mock */ - when(identifierRepository.findById(IDENTIFIER_1_ID)) - .thenReturn(Optional.of(identifier)); - - /* test */ - final String response = identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.BIBTEX); - final String title = IDENTIFIER_1_CREATOR_1.getLastname() + ", " + IDENTIFIER_1_CREATOR_1.getFirstname() + " and Institute of Science and Technology Austria"; - assertTrue(response.contains(title)); - assertTrue(response.contains("" + IDENTIFIER_1_PUBLICATION_YEAR)); - } - - @Test - public void exportBibliography_ieee_succeeds() throws IdentifierNotFoundException, IdentifierRequestException { - - /* mock */ - when(identifierRepository.findById(IDENTIFIER_1_ID)) - .thenReturn(Optional.of(IDENTIFIER_1)); - - /* test */ - final String response = identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.IEEE); - assertTrue(response.contains(IDENTIFIER_1_TITLE_1.getTitle())); - assertTrue(response.contains("" + IDENTIFIER_1_PUBLICATION_YEAR)); - assertTrue(response.contains(IDENTIFIER_1_CREATOR_1.getLastname())); - } - - @Test - public void exportBibliography_ieeeMixedPersonAndOrg_succeeds() throws IdentifierNotFoundException, - IdentifierRequestException { - final Creator org = Creator.builder() - .id(CREATOR_2_ID) - .creatorName("Institute of Science and Technology Austria") - .nameIdentifier("https://ror.org/03gnh5541") - .nameIdentifierScheme(NameIdentifierSchemeType.ROR) - .build(); - final Identifier identifier = IDENTIFIER_1.toBuilder() - .creators(List.of(IDENTIFIER_1_CREATOR_1, org)) - .build(); - - /* mock */ - when(identifierRepository.findById(IDENTIFIER_1_ID)) - .thenReturn(Optional.of(identifier)); - - /* test */ - final String response = identifierService.exportBibliography(IDENTIFIER_1_ID, BibliographyTypeDto.IEEE); - final String title = IDENTIFIER_1_CREATOR_1.getFirstname().charAt(0) + ". " + IDENTIFIER_1_CREATOR_1.getLastname() + ", Institute of Science and Technology Austria"; - assertTrue(response.contains(title)); - assertTrue(response.contains("" + IDENTIFIER_1_PUBLICATION_YEAR)); - } - - @Test - public void delete_succeeds() throws IdentifierNotFoundException { - - /* mock */ - when(identifierRepository.existsById(IDENTIFIER_1_ID)) - .thenReturn(true); - when(identifierIdxRepository.existsById(IDENTIFIER_1_ID)) - .thenReturn(true); - doNothing() - .when(identifierRepository) - .delete(IDENTIFIER_1); - doNothing() - .when(identifierIdxRepository) - .deleteById(IDENTIFIER_1_ID); - - /* test */ - identifierService.delete(IDENTIFIER_1_ID); - } - - @Test - public void delete_notFound_fails() { - - /* mock */ - when(identifierRepository.findById(IDENTIFIER_1_ID)) - .thenReturn(Optional.empty()); - doNothing() - .when(identifierRepository) - .delete(IDENTIFIER_1); - - /* test */ - assertThrows(IdentifierNotFoundException.class, () -> { - identifierService.delete(IDENTIFIER_1_ID); - }); - } - - @Test - public void exportMetadata_succeeds() throws IdentifierNotFoundException { - - /* mock */ - when(identifierRepository.findById(IDENTIFIER_1_ID)) - .thenReturn(Optional.of(IDENTIFIER_1)); - - /* test */ - final InputStreamResource response = identifierService.exportMetadata(IDENTIFIER_1_ID); - assertNotNull(response); - } - - @Test - public void exportMetadata_notFound_fails() { - - /* mock */ - when(identifierRepository.findById(IDENTIFIER_1_ID)) - .thenReturn(Optional.empty()); - - /* test */ - assertThrows(IdentifierNotFoundException.class, () -> { - identifierService.exportMetadata(IDENTIFIER_1_ID); - }); - } - - @Test - public void exportResource_database_fails() { - - /* mock */ - when(identifierRepository.findById(IDENTIFIER_4_ID)) - .thenReturn(Optional.of(IDENTIFIER_4)); - - /* test */ - assertThrows(IdentifierRequestException.class, () -> { - identifierService.exportResource(IDENTIFIER_4_ID); - }); - } - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/MetadataServiceUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/MetadataServiceUnitTest.java deleted file mode 100644 index 3dd124f81e..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/MetadataServiceUnitTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.crossref.CrossrefDto; -import at.tuwien.api.orcid.OrcidDto; -import at.tuwien.api.ror.RorDto; -import at.tuwien.api.user.external.ExternalMetadataDto; -import at.tuwien.api.user.external.affiliation.ExternalAffiliationDto; -import at.tuwien.exception.*; -import at.tuwien.gateway.CrossrefGateway; -import at.tuwien.gateway.OrcidGateway; -import at.tuwien.gateway.RorGateway; -import at.tuwien.repository.mdb.IdentifierRepository; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.when; - -@ExtendWith(SpringExtension.class) -@SpringBootTest -public class MetadataServiceUnitTest extends BaseUnitTest { - - @MockBean - private IdentifierRepository identifierRepository; - - @MockBean - private IdentifierIdxRepository identifierIdxRepository; - - @MockBean - private OrcidGateway orcidGateway; - - @MockBean - private RorGateway rorGateway; - - @MockBean - private CrossrefGateway crossrefGateway; - - @Autowired - private MetadataService metadataService; - - @Autowired - private ObjectMapper objectMapper; - - @Test - public void findByUrl_orcid_succeeds() throws OrcidNotFoundException, RemoteUnavailableException, - RorNotFoundException, IOException, DoiNotFoundException { - final OrcidDto orcid = objectMapper - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .readValue(new File("src/test/resources/orcid_jdoe.json"), OrcidDto.class); - - /* mock */ - when(orcidGateway.findByUrl(USER_1_ORCID_URL)) - .thenReturn(orcid); - - /* test */ - final ExternalMetadataDto response = metadataService.findByUrl(USER_1_ORCID_URL); - assertEquals(USER_1_FIRSTNAME, response.getGivenNames()); - assertEquals(USER_1_LASTNAME, response.getFamilyName()); - } - - @Test - public void findByUrl_orcid_fails() throws OrcidNotFoundException { - - /* mock */ - doThrow(OrcidNotFoundException.class) - .when(orcidGateway) - .findByUrl(anyString()); - - /* test */ - assertThrows(OrcidNotFoundException.class, () -> { - metadataService.findByUrl("https://orcid.org/1234567890"); - }); - } - - @Test - public void findByUrl_doi_succeeds() throws OrcidNotFoundException, RemoteUnavailableException, - RorNotFoundException, IOException, DoiNotFoundException { - final CrossrefDto doi = objectMapper - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .readValue(new File("src/test/resources/doi_ec.json"), CrossrefDto.class); - - /* mock */ - when(crossrefGateway.findById(FUNDER_1_IDENTIFIER_ID_ONLY)) - .thenReturn(doi); - - /* test */ - final ExternalMetadataDto response = metadataService.findByUrl(FUNDER_1_IDENTIFIER); - assertEquals(1, response.getAffiliations().length); - final ExternalAffiliationDto affiliation0 = response.getAffiliations()[0]; - assertEquals(FUNDER_1_NAME, affiliation0.getOrganizationName()); - assertEquals(FUNDER_1_IDENTIFIER, affiliation0.getCrossrefFunderId()); - } - - @Test - public void findByUrl_doi_fails() throws DoiNotFoundException { - - /* mock */ - doThrow(DoiNotFoundException.class) - .when(crossrefGateway) - .findById(anyString()); - - /* test */ - assertThrows(DoiNotFoundException.class, () -> { - metadataService.findByUrl("https://doi.org/10.12345/1234567890"); - }); - } - - @Test - public void findByUrl_ror_succeeds() throws OrcidNotFoundException, RemoteUnavailableException, - RorNotFoundException, IOException, DoiNotFoundException { - final RorDto ror = objectMapper - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .readValue(new File("src/test/resources/ror_tuw.json"), RorDto.class); - - /* mock */ - when(rorGateway.findById(anyString())) - .thenReturn(ror); - - /* test */ - final ExternalMetadataDto response = metadataService.findByUrl(CREATOR_4_AFFIL_ROR); - assertEquals(1, response.getAffiliations().length); - final ExternalAffiliationDto affiliation0 = Arrays.asList(response.getAffiliations()).get(0); - assertEquals("TU Wien", affiliation0.getOrganizationName()); - } - - @Test - public void findByUrl_ror_fails() throws RorNotFoundException { - - /* mock */ - doThrow(RorNotFoundException.class) - .when(rorGateway) - .findById(anyString()); - - /* test */ - assertThrows(RorNotFoundException.class, () -> { - metadataService.findByUrl("https://ror.org/1234567890"); - }); - } - - @Test - public void findByUrl_rorMalformed_fails() { - - /* test */ - assertThrows(RorNotFoundException.class, () -> { - metadataService.findByUrl("https://ror.org/"); - }); - } - - @Test - public void findByUrl_isniMalformed_fails() { - - /* test */ - assertThrows(RemoteUnavailableException.class, () -> { - metadataService.findByUrl("https://isni.org/isni/0000000506791090"); - }); - } -} diff --git a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/UserServiceUnitTest.java b/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/UserServiceUnitTest.java deleted file mode 100644 index d81b759744..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/java/at/tuwien/service/UserServiceUnitTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.entities.user.User; -import at.tuwien.exception.*; -import at.tuwien.repository.mdb.UserRepository; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; - -@ExtendWith(SpringExtension.class) -@SpringBootTest -public class UserServiceUnitTest extends BaseUnitTest { - - @MockBean - private IdentifierIdxRepository identifierIdxRepository; - - @MockBean - private UserRepository userRepository; - - @Autowired - private UserService userService; - - @Test - public void findByUsername_succeeds() throws UserNotFoundException { - - /* mock */ - when(userRepository.findByUsername(USER_1_USERNAME)) - .thenReturn(Optional.of(USER_1)); - - /* test */ - final User response = userService.findByUsername(USER_1_USERNAME); - assertEquals(USER_1_ID, response.getId()); - assertEquals(USER_1_USERNAME, response.getUsername()); - } - - @Test - public void findByUsername_fails() { - - /* mock */ - when(userRepository.findByUsername(USER_1_USERNAME)) - .thenReturn(Optional.empty()); - - /* test */ - assertThrows(UserNotFoundException.class, () -> { - userService.findByUsername(USER_1_USERNAME); - }); - } - - -} diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/application.properties b/dbrepo-identifier-service/rest-service/src/test/resources/application.properties deleted file mode 100644 index 22397307c1..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/application.properties +++ /dev/null @@ -1,28 +0,0 @@ -# enable local spring profile -spring.profiles.active=local - -# disable discovery -spring.cloud.discovery.enabled = false - -# disable cloud config and config discovery -spring.cloud.config.discovery.enabled = false -spring.cloud.config.enabled = false - -# internal datasource -spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS FDA;NON_KEYWORDS=value -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password=password -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect -spring.sql.init.mode=always -spring.sql.init.schema-locations=classpath*:init/schema.sql -spring.jpa.hibernate.ddl-auto=create - -# datacite -fda.datacite.url: https://api.test.datacite.org/ -fda.datacite.prefix: 10.12345 -fda.datacite.username: test-user -fda.datacite.password: test-password - -fda.mapping.path: /tmp -fda.table.path: /tmp \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa0.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa0.txt deleted file mode 100644 index f43414ca5e..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa0.txt +++ /dev/null @@ -1 +0,0 @@ -(2022). Sweden weather data. Swedish Government. http://localhost:3000/pid/4 \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa1.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa1.txt deleted file mode 100644 index 57d54a5ba6..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa1.txt +++ /dev/null @@ -1 +0,0 @@ -M., Mustermann. (2022). Austrian weather data. Austrian Government. http://localhost:3000/pid/1 \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa2.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa2.txt deleted file mode 100644 index 69c4972082..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa2.txt +++ /dev/null @@ -1 +0,0 @@ -M., Mustermann & M., Mustermann. (2022). Australian weather data. Australian Government. http://localhost:3000/pid/2 \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa3.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa3.txt deleted file mode 100644 index 028a58d2d7..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa3.txt +++ /dev/null @@ -1 +0,0 @@ -M., Mustermann, M., Mustermann & M., Mustermann. (2022). Norwegian weather data. Norwegian Government. http://localhost:3000/pid/3 \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa4.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa4.txt deleted file mode 100644 index ce6a65da6b..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_apa4.txt +++ /dev/null @@ -1 +0,0 @@ -M., Mustermann. (2022). Austrian weather data. Austrian Government. https://doi.org/10.1000/183 \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex0.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex0.txt deleted file mode 100644 index 0f797e3861..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex0.txt +++ /dev/null @@ -1,7 +0,0 @@ -@misc{dbrepo2022, - author = {}, - title = {Sweden weather data}, - url = {\url{http://localhost:3000/pid/4}}, - month = {7}, - year = {2022} -} \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex1.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex1.txt deleted file mode 100644 index bab1cdadb1..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex1.txt +++ /dev/null @@ -1,7 +0,0 @@ -@misc{dbrepo2022, - author = {Mustermann, Max}, - title = {Austrian weather data}, - url = {\url{http://localhost:3000/pid/1}}, - month = {5}, - year = {2022} -} \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex2.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex2.txt deleted file mode 100644 index 9df96bed21..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex2.txt +++ /dev/null @@ -1,7 +0,0 @@ -@misc{dbrepo2022, - author = {Mustermann, Max and Mustermann, Martina}, - title = {Australian weather data}, - url = {\url{http://localhost:3000/pid/2}}, - month = {7}, - year = {2022} -} \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex3.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex3.txt deleted file mode 100644 index 44190f2752..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_bibtex3.txt +++ /dev/null @@ -1,7 +0,0 @@ -@misc{dbrepo2022, - author = {Mustermann, Max}, - title = {Austrian weather data}, - doi = {10.1000/183}, - month = {5}, - year = {2022} -} \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee0.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee0.txt deleted file mode 100644 index 35a5374403..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee0.txt +++ /dev/null @@ -1 +0,0 @@ -[1] “Sweden weather data“, Swedish Government, 2022, Available: http://localhost:3000/pid/4. \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee1.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee1.txt deleted file mode 100644 index ac28d6fdee..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee1.txt +++ /dev/null @@ -1 +0,0 @@ -[1] M. Mustermann, “Austrian weather data“, Austrian Government, 2022, Available: http://localhost:3000/pid/1. \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee2.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee2.txt deleted file mode 100644 index 909031b2db..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee2.txt +++ /dev/null @@ -1 +0,0 @@ -[1] M. Mustermann and M. Mustermann, “Australian weather data“, Australian Government, 2022, Available: http://localhost:3000/pid/2. \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee3.txt b/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee3.txt deleted file mode 100644 index 286d4b8027..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/bibliography/style_ieee3.txt +++ /dev/null @@ -1 +0,0 @@ -[1] M. Mustermann, “Austrian weather data“, Austrian Government, 2022, doi: 10.1000/183. \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/csv/keyboard.csv b/dbrepo-identifier-service/rest-service/src/test/resources/csv/keyboard.csv deleted file mode 100644 index 21c3c1e040..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/csv/keyboard.csv +++ /dev/null @@ -1,4969 +0,0 @@ -Shift key time,Esc key time,Ctrl key time,Alt key time,User ID,Test date,Gender,Right hand,Birth year,Computer skill level -1.1315,0.9827,1.06866667,0.90588889,1,3/10/2019 10:17,male,1,1964,4 -1.042,1.2572,1.2215,1.13133333,1,11/14/2019 8:57,male,1,1964,4 -1.12722222,1.11575,1.24833333,1.1035,2,2/6/2019 0:00,female,1,1965, -1.33814286,1.43566667,1.58525,1.2845,4,2/10/2019 0:00,male,1,1954,4 -2.0555,1.4265,0.91785714,1.66333333,4,3/11/2019 13:10,male,1,1954,4 -1.851,1.75725,1.481,1.90742857,4,2/9/2019 0:00,male,1,1954,4 -1.242,1.364,1.30457143,2.05133333,4,2/10/2019 0:00,male,1,1954,4 -1.6315,1.31514286,1.07133333,1.42328571,4,10/1/2019 10:17,male,1,1954,4 -1.351,1.909,1.37833333,3.66075,4,2/9/2019 0:00,male,1,1954,4 -1.23233333,1.308,1.325,1.02027273,4,2/13/2019 0:00,male,1,1954,4 -1.407,1.4645,1.3726,1.939,4,2/10/2019 0:00,male,1,1954,4 -1.25366667,1.11983333,1.0786,1.9828,4,3/9/2019 0:00,male,1,1954,4 -0.83433333,0.91425,1.07875,0.915,6,2/6/2019 0:00,male,1,1974, -1.00922222,0.85871429,1.07542857,1.01371429,6,2/26/2019 0:00,male,1,1974, -0.6483,0.83916667,0.67513333,0.7926,7,2/6/2019 0:00,female,1,1997, -0.79875,0.87953333,0.84928571,0.8878,8,2/6/2019 0:00,male,0,1976, -1.0078,1.084,1.33066667,1.4336,11,2/7/2019 0:00,female,1,1974, -0.65666667,0.8717,0.731375,0.70890909,12,2/7/2019 0:00,female,1,1991, -0.757,0.733,0.79955556,0.8475,13,2/7/2019 0:00,female,1,1995, -0.867375,0.85816667,1.0091,0.85688889,14,2/7/2019 0:00,male,1,1995, -1.217,1.816,1.547,1.13766667,15,2/10/2019 0:00,female,1,1959, -0.5342,0.63008333,0.57711765,0.51335714,16,2/27/2019 0:00,male,1,1996, -0.6925,0.71164286,0.73025,0.72925,25,2/27/2019 0:00,male,1,1996, -1.00528571,1.08288889,1.76,1.3865,114,2/26/2019 0:00,female,1,1977, -0.842,0.84927273,1.084,1.11075,115,2/27/2019 0:00,male,1,1996, -0.64661538,0.64628571,0.6477,0.85,116,2/27/2019 0:00,male,1,1996, -0.8312,0.894,1.057,0.8468,117,2/27/2019 0:00,male,1,1996, -0.80885714,1.04216667,0.87963636,1.22366667,120,3/5/2019 0:00,male,1,1999, -0.8112,0.7375,1.52675,1.12016667,121,3/5/2019 0:00,female,1,1999, -0.676875,0.77066667,0.75535714,0.8991,122,3/5/2019 0:00,male,1,1999, -1.04611111,0.9679,1.33,0.99825,123,3/5/2019 0:00,male,0,1999, -1.418,1.30325,1.57083333,1.3145,124,3/5/2019 0:00,male,1,1987, -1.418,1.30325,1.57083333,1.3145,124,3/5/2019 0:00,male,1,1987, -0.7904,0.71209091,0.61514286,0.90054545,125,3/5/2019 0:00,male,1,1999, -0.6872,0.58957143,0.645375,0.76925,126,3/5/2019 0:00,male,1,1999, -0.984,0.8,0.864,0.56,127,3/5/2019 0:00,male,1,1999, -0.8188,0.80718182,0.92336364,0.75844444,128,3/5/2019 0:00,female,1,1999, -1.07428571,0.7974,0.90233333,0.89092308,130,3/5/2019 0:00,female,1,1999, -0.68311111,0.8806,0.587,0.948875,131,3/5/2019 0:00,male,1,1986, -0.69036364,0.70790909,0.647,0.62335714,131,3/7/2019 0:00,male,1,1986, -0.6075,0.5803,0.5397,0.53626316,131,3/7/2019 0:00,male,1,1986, -0.65108333,0.65275,0.73257143,1.369125,135,3/5/2019 0:00,male,1,1999, -0.96833333,0.70971429,0.89314286,0.71518182,139,3/5/2019 0:00,male,1,1997, -0.93771429,0.8199,1.110875,0.87685714,143,3/5/2019 0:00,female,1,1999, -0.816,0.82811111,0.895875,0.68055556,144,3/7/2019 0:00,female,1,2000, -0.83842857,0.67892308,0.78066667,1.10928571,145,3/7/2019 0:00,male,1,2000, -0.58154545,0.88175,0.6398,1.02455556,146,3/7/2019 0:00,male,1,1999, -0.93957143,0.89228571,0.87745455,0.92975,147,3/7/2019 0:00,female,1,1999, -0.75046154,0.89666667,0.625,0.81916667,148,3/7/2019 0:00,male,1,1999, -0.84657143,0.79755556,0.89663636,0.86425,149,3/7/2019 0:00,female,1,1999, -0.89275,0.99433333,0.82233333,0.9162,151,3/7/2019 0:00,male,1,1999, -6.1895,1.7645,0.891,1.9292,152,3/7/2019 0:00,male,1,1999, -0.77425,0.960375,0.92622222,0.70563636,154,3/7/2019 0:00,male,1,1999, -0.70755556,0.6365,1.1422,0.78972727,155,3/7/2019 0:00,male,1,1998, -0.8857,0.78281818,1.163375,0.6775,156,3/7/2019 0:00,male,1,1999, -2.39966667,2.733,1.337,1.3025,157,3/7/2019 0:00,male,1,1998, -1.373,1.25233333,1.35414286,1.2313,158,3/7/2019 0:00,female,1,1999, -1.75933333,3.33966667,1.14625,0.901,159,3/7/2019 0:00,female,1,1999, -0.896,1.24625,0.866875,0.95477778,160,3/7/2019 0:00,female,1,1999, -1.308,1.0075,1.291,2.279,161,3/7/2019 0:00,female,1,1999, -0.9614,0.88583333,0.99866667,0.94233333,162,3/7/2019 0:00,female,1,2006, -0.7855,0.70561538,1.05416667,0.79088889,162,3/7/2019 0:00,female,1,2006, -1.11583333,0.96909091,0.81271429,0.90942857,164,3/9/2019 0:00,female,1,1991, -0.72083333,0.70366667,0.75125,0.46515385,165,3/9/2019 0:00,female,1,1996, -0.829,0.893625,0.82383333,0.73230769,166,3/9/2019 0:00,female,1,1992, -0.52884615,0.59291667,0.61076923,0.7606,168,3/9/2019 0:00,male,1,1979, -0.981125,0.9803,0.72033333,0.92325,168,3/9/2019 0:00,male,1,1979, -0.66344444,0.58917647,0.62266667,0.73090909,169,3/9/2019 0:00,male,1,1994, -1.201125,0.91522222,1.4325,1.1884,173,3/27/2019 15:48,female,1,1994, -0.776,0.89316667,0.79175,1.61433333,174,3/28/2019 13:38,male,1,1997, -0.8386,0.945,0.97783333,0.7218,175,3/28/2019 13:38,male,1,1999, -1.02766667,1.04766667,1.221,1.08577778,176,3/28/2019 13:39,female,1,1999, -0.91245455,0.91183333,1.0544,0.9046,177,5/10/2019 12:02,male,1,1995, -1.49,4.0744,1.449,1.347,177,5/14/2019 12:53,male,1,1995, -0.862,0.97554545,0.9338,0.90075,177,4/2/2019 11:32,male,1,1995, -4.6365,1.8975,3.18866667,1.314,177,5/14/2019 18:35,male,1,1995, -3.6185,3.2785,0.993,1.8435,177,4/9/2019 15:10,male,1,1995, -2.4175,2.537,2.75533333,1.293,177,5/14/2019 18:37,male,1,1995, -0.67207692,0.716125,0.7805,0.7948,178,4/4/2019 12:24,male,1,1997, -1.066,1.0225,0.921,1.20883333,179,4/4/2019 12:25,male,0,1999, -0.76857143,0.86318182,0.98255556,1.093,180,4/4/2019 12:25,female,1,1999, -0.94272727,0.68763636,1.18716667,2.3435,181,4/4/2019 12:25,male,1,1999, -0.5747,0.7233,0.67144444,0.58705556,182,4/4/2019 12:25,male,1,1999, -0.8422,1.11283333,1.08666667,1.179,183,4/4/2019 12:24,female,0,1988, -1.05883333,0.9445,1.4578,0.998375,184,4/4/2019 12:25,female,1,1999, -0.71355556,0.6338,0.77914286,0.64222222,185,4/4/2019 12:25,male,1,1999, -0.56246667,0.73257143,0.81123077,0.720875,186,4/4/2019 12:25,male,1,1998, -1.101125,2.0505,1.3452,1.346,187,4/4/2019 12:25,female,1,1999, -1.07583333,1.0542,1.36388889,0.77314286,188,4/4/2019 12:25,female,1,1999, -1.19085714,1.32566667,2.10175,1.31,189,4/4/2019 12:25,female,1,2000, -1.7505,1.42133333,2.118,2.1285,190,4/4/2019 12:25,female,1,2000, -1.4745,1.08333333,2.80025,1.08666667,193,4/4/2019 12:25,female,0,1999, -0.81775,0.97328571,0.79528571,0.89433333,194,4/4/2019 13:45,male,1,1999, -0.8988,1.29714286,1.37471429,0.79925,195,4/4/2019 13:46,female,1,1999, -1.0275,0.89945455,1.227,1.1,197,4/4/2019 13:55,female,1,1999, -0.85433333,0.96733333,1.147,0.7703,198,4/4/2019 13:55,female,1,2000, -0.92877778,0.81788889,0.805,1.2935,199,4/4/2019 13:59,male,1,1998, -2.3305,1.20828571,1.358,1.30466667,200,4/4/2019 13:57,female,1,1999, -1.981,1.57866667,2.0115,1.150375,201,4/4/2019 13:58,female,1,1999, -1.572,1.312,2.638,2.244,202,4/9/2019 9:03,female,1,1961, -0.7431,0.70033333,1.04533333,0.87890909,204,4/16/2019 8:14,male,1,1985,5 -0.749625,1.021,1.0971,1.612,206,4/9/2019 11:24,male,1,1985, -1.00214286,1.1108,1.047,1.05111111,207,4/9/2019 14:51,female,1,1967, -1.24485714,0.88057143,1.06814286,0.899375,208,4/9/2019 15:10,female,1,1999, -1.0675,1.2282,1.24555556,0.919125,209,4/9/2019 15:10,female,1,2000, -1.4896,1.232,1.281,0.832,210,4/9/2019 15:10,male,1,1998, -0.99542857,0.93333333,1.00791667,1.568,211,4/9/2019 15:10,female,0,1999, -0.95985714,0.89311111,1.2088,1.19542857,212,4/9/2019 15:10,female,1,1999, -0.85735714,0.6662,1.4134,0.99928571,213,4/9/2019 15:10,female,1,1999, -0.55842857,0.6027,0.62378571,0.7051,215,4/9/2019 15:13,female,1,1999, -0.838,0.82588889,0.9448,0.86272727,219,4/10/2019 9:27,female,1,1987, -1.427,2.098,1.19325,1.518,221,4/11/2019 2:39,male,1,1969, -1.02833333,1.08977778,0.97775,0.957,221,4/11/2019 2:40,male,1,1969, -0.7435,1.03633333,0.82166667,0.8744,226,4/17/2019 10:48,female,1,1990, -0.984125,0.812,1.3715,0.69557143,227,4/18/2019 9:45,male,1,1987, -0.462125,0.713,0.84284615,0.7152,231,4/19/2019 18:28,male,1,1995, -0.8540625,1.026,0.97,0.96228571,232,11/10/2019 9:31,female,1,1987,3 -0.91342857,1.0988,1.261,0.9326,232,11/6/2019 7:41,female,1,1987,3 -1.5515,1.2635,1.57066667,1.53657143,233,4/20/2019 19:04,female,1,1993, -1.1595,1.527875,1.1534,1.21357143,235,4/23/2019 8:52,male,0,1972, -0.7601,0.879,0.73288889,0.93277778,237,4/24/2019 10:59,female,1,1981, -0.997,1.21466667,1.13827273,0.9992,240,5/13/2019 22:31,female,1,1995, -1.35875,0.7226,1.2905,0.927875,241,5/14/2019 8:05,male,1,1988, -1.60766667,0.93461538,1.3092,0.91642857,242,5/14/2019 23:00,male,1,1963, -1.61066667,0.928,0.95966667,0.94245455,243,5/14/2019 22:53,male,1,1977, -1.15075,1.365,1.4175,1.61228571,244,5/18/2019 15:03,male,1,1954, -1.655,1.89333333,1.58833333,1.307,245,5/21/2019 9:11,female,1,1970, -1.419,1.314,1.39925,1.92566667,254,5/22/2019 10:23,female,1,1970, -1.114,2.239,1.382,1.163,254,11/7/2019 10:18,female,1,1970, -0.65888889,0.77075,0.75322222,0.7986,271,5/30/2019 23:46,male,1,1993,5 -0.83,1.1545,0.949,1.9535,272,5/27/2019 16:02,female,1,1997, -0.7915,0.87942857,0.89028571,0.85584615,273,5/27/2019 20:14,male,1,1998, -0.56292308,0.56175,0.78945455,0.6128,273,5/27/2019 23:34,male,1,1998, -1.8705,1.32666667,0.7953,0.8994,275,5/28/2019 9:12,female,1,1997, -0.89755556,0.807125,0.73,0.85083333,277,5/28/2019 10:32,male,1,1997, -1.83983333,1.52575,2.177,1.27566667,280,5/28/2019 12:22,male,1,1997, -0.95381818,0.794375,0.93477778,0.9416,280,5/28/2019 12:16,male,1,1997, -0.56846154,0.58425,0.726,0.61276923,280,5/28/2019 12:20,male,1,1997, -1.1004,0.9715,1.3382,1.943,284,5/28/2019 14:19,male,1,1997, -0.66854545,1.0038,0.71181818,1.314,285,5/28/2019 14:22,male,1,1998, -0.8606,0.776,1.27414286,1.13266667,286,6/3/2019 19:04,male,1,1997, -0.7925,0.723375,0.7885,1.40866667,287,6/5/2019 20:49,female,1,1993, -0.94575,0.69854545,0.73457143,0.82945455,287,6/5/2019 20:51,female,1,1993, -0.75418182,0.7635,0.67111111,1.09814286,297,6/7/2019 10:14,male,1,1986, -1.663,0.9845,2.678,1.773,300,6/7/2019 10:22,male,1,1954, -0.68428571,0.7762,0.77233333,0.8705,302,6/7/2019 10:03,female,1,1991, -0.6595,2.4575,0.895,0.979,312,6/11/2019 9:57,male,1,1994, -1.131,1.0414,1.98766667,1.59257143,313,6/17/2019 2:19,male,1,1997, -0.8375,0.77757143,0.83642857,0.7387,313,6/12/2019 17:11,male,1,1997, -1.65266667,1.78766667,2.15725,1.38475,313,6/17/2019 2:12,male,1,1997, -0.6855,0.86533333,0.74666667,0.65153846,316,7/8/2019 11:59,male,1,1995, -1.256,1.50225,1.12971429,1.438,317,7/9/2019 0:13,male,1,1966, -1.0644,0.90466667,0.9005,0.97871429,317,7/9/2019 0:15,male,1,1966, -1.5224,1.72966667,2.00625,1.36533333,319,2/18/2021 9:36,female,1,1970,3 -1.01066667,0.67428571,1.09688889,0.72866667,321,7/24/2019 8:29,male,1,1981, -0.90371429,1.031,1.40083333,1.15183333,322,8/2/2019 15:03,female,1,1975, -1.00785714,0.90214286,1.105,1.18733333,322,8/2/2019 15:04,female,1,1975, -1.21828571,1.20742857,1.21966667,1.057,323,8/3/2019 9:11,male,1,1969, -0.97283333,2.679,1.64,3.835,329,10/1/2019 13:45,female,1,2000, -0.72215385,0.6514,0.6034,0.84184615,330,11/7/2019 23:51,male,1,2000, -0.558,0.82675,0.8116,0.734,330,11/7/2019 23:55,male,1,2000, -0.79357143,0.87075,0.91763636,0.86925,330,10/20/2019 18:24,male,1,2000, -0.64825,0.783125,0.68929412,0.66083333,330,11/7/2019 23:57,male,1,2000, -0.59814286,0.68321429,0.791375,0.91716667,330,11/7/2019 23:48,male,1,2000, -0.62923077,0.6355,0.643125,0.82271429,330,11/8/2019 0:00,male,1,2000, -0.68042857,0.7295,0.7140625,0.63988889,331,11/4/2019 8:36,male,0,1999, -0.628,0.57309091,0.82173333,0.57075,331,11/10/2019 16:34,male,0,1999, -0.76125,0.90666667,0.72416667,0.826875,331,11/5/2019 8:32,male,0,1999, -0.68364286,0.54366667,0.77871429,0.71544444,331,11/10/2019 16:35,male,0,1999, -0.66533333,1.06425,1.007,0.61775,331,11/6/2019 11:16,male,0,1999, -0.57845455,0.58307692,0.57158333,0.52494118,331,11/10/2019 17:14,male,0,1999, -0.585125,0.77613333,0.81514286,0.55315385,331,11/10/2019 16:33,male,0,1999, -1.44585714,1.03771429,1.19066667,1.13571429,332,10/1/2019 13:45,female,1,2000, -1.17471429,0.97383333,0.9002,1.203,332,10/1/2019 13:48,female,1,2000, -2.155,2.477,3.132,8.691,332,10/1/2019 13:44,female,1,2000, -0.71044444,1.58875,0.8578,0.7646,333,10/1/2019 13:43,male,1,2000, -1.101,1.1145,0.83742857,1.40716667,335,10/1/2019 13:44,female,1,2000, -0.83471429,0.94477778,1.01685714,0.93525,336,10/1/2019 13:48,female,1,2001, -0.8755,0.83066667,0.91833333,0.853,337,10/1/2019 13:42,male,1,2000,4 -0.8204,0.9403,0.99966667,0.87214286,337,10/19/2019 11:05,male,1,2000,4 -0.60869231,0.83171429,0.75330769,0.792375,339,10/1/2019 17:03,male,1,2000, -1.135625,0.87271429,1.1765,1.1175,340,10/1/2019 17:04,male,1,1999, -0.84545455,0.77628571,0.9915,0.826125,341,10/1/2019 17:04,male,1,2000, -0.8834,0.81090909,0.83008333,0.94014286,341,10/21/2019 13:24,male,1,2000, -0.88509091,1.07633333,0.86871429,1.19642857,342,11/10/2019 23:39,female,1,2000, -0.9518,0.7792,1.1079,0.928,342,11/11/2019 0:25,female,1,2000, -0.82157143,0.997125,0.98328571,1.18857143,342,11/10/2019 23:49,female,1,2000, -0.889375,0.80108333,0.97875,0.77042857,342,11/11/2019 0:26,female,1,2000, -0.72075,0.96583333,0.902,0.996125,342,11/10/2019 23:59,female,1,2000, -0.7614,0.7808,1.0212,1.51683333,342,11/5/2019 6:40,female,1,2000, -0.896,0.7881,0.97266667,1.22316667,342,11/11/2019 0:14,female,1,2000, -1.53857143,0.7544,1.10525,0.842,343,10/1/2019 17:04,female,1,2001, -0.66555556,0.7482,0.66326667,0.808875,344,11/8/2019 22:51,male,1,2000, -0.82285714,0.605,0.7948,0.95066667,344,11/8/2019 22:58,male,1,2000, -0.822,0.916,0.68283333,0.749,344,11/8/2019 22:52,male,1,2000, -0.75333333,0.756,0.6511,0.6085,344,11/8/2019 23:00,male,1,2000, -0.804625,0.65566667,0.68863636,0.7724,344,11/8/2019 22:54,male,1,2000, -0.6962,0.6215,0.68846667,0.562,344,11/8/2019 23:01,male,1,2000, -0.583,0.73022222,0.65483333,0.94014286,344,11/8/2019 22:47,male,1,2000, -0.711,0.86341176,0.664625,0.64354545,344,11/8/2019 22:56,male,1,2000, -0.6377,0.74753846,0.68325,0.61666667,345,10/19/2019 14:13,male,1,2000, -1.14233333,0.76854545,0.96044444,0.73571429,346,10/1/2019 17:03,female,1,2000, -0.67127273,0.55766667,0.6864375,0.49738462,346,11/10/2019 12:27,female,1,2000, -0.7405,0.57053333,0.7569,0.495,346,11/9/2019 11:35,female,1,2000, -0.641,0.56284615,0.6454,0.51021429,346,11/10/2019 12:29,female,1,2000, -2.60566667,1.511,2.45866667,1.63316667,346,11/9/2019 12:47,female,1,2000, -0.5506875,0.48623529,0.58016667,0.5174,346,11/10/2019 12:30,female,1,2000, -0.76064286,0.666,0.5312,0.48142857,346,11/10/2019 11:26,female,1,2000, -0.61136364,0.81158333,0.67275,0.55971429,346,11/10/2019 12:32,female,1,2000, -0.55935714,0.651,0.71181818,0.67233333,347,10/1/2019 17:03,male,0,2000, -0.65675,0.6552,0.62945455,0.58075,347,11/4/2019 16:50,male,0,2000, -0.768,0.72575,0.561,0.449,347,11/8/2019 11:34,male,0,2000, -2.292,2.7875,2.4555,2.738,347,10/19/2019 13:17,male,0,2000, -0.54281818,0.57592857,0.59286667,0.803375,347,11/5/2019 10:19,male,0,2000, -0.55845455,0.64776471,0.7505,0.73655556,347,11/10/2019 11:13,male,0,2000, -2.8774,1.984,1.92,1.574,347,10/19/2019 13:18,male,0,2000, -0.4394,0.534,0.56628571,0.50273333,347,11/6/2019 11:22,male,0,2000, -1.93633333,1.84966667,1.76933333,1.9315,347,10/19/2019 13:55,male,0,2000, -0.5471875,0.55790909,0.44452941,0.469,347,11/7/2019 18:53,male,0,2000, -0.87277778,0.885,0.79011111,0.85954545,348,10/1/2019 17:03,male,1,2000, -1.36833333,1.1285,0.85641667,0.9224,350,11/4/2019 7:02,female,1,2000, -0.78166667,0.77557143,0.6982,0.90825,350,11/8/2019 9:34,female,1,2000, -0.8405,1.144,0.69581818,0.915,350,11/5/2019 9:18,female,1,2000, -1.335,1.2464,0.86444444,0.7962,350,11/9/2019 13:39,female,1,2000, -0.98416667,0.84644444,0.66926667,0.87314286,350,11/6/2019 10:51,female,1,2000, -0.7793,0.74509091,0.62342857,1.00077778,350,11/10/2019 11:51,female,1,2000, -1.70775,1.69414286,0.914,1.2874,350,10/1/2019 17:04,female,1,2000, -1.001,1.03133333,0.781,0.79233333,350,11/7/2019 13:22,female,1,2000, -0.812125,0.6803,0.75409091,0.73109091,352,11/9/2019 11:23,female,1,2000,4 -0.7098,0.85833333,0.6992,0.65185714,352,11/4/2019 8:24,female,1,2000,4 -0.927,0.7177,0.7223,0.62655556,352,11/5/2019 9:17,female,1,2000,4 -0.7184,0.604,0.66388889,0.5395,352,11/10/2019 12:00,female,1,2000,4 -0.86825,0.933,1.056,0.668,352,11/6/2019 17:56,female,1,2000,4 -0.8312,0.74507692,0.9555,0.61266667,352,11/8/2019 11:46,female,1,2000,4 -0.7665,0.65193333,0.75366667,0.77416667,352,11/3/2019 19:43,female,1,2000,4 -1.07971429,0.972,1.90071429,1.167,353,10/1/2019 17:03,female,1,2000, -0.8076,0.789,0.94875,0.91616667,353,10/1/2019 17:04,female,1,2000, -0.76236364,0.75833333,0.62657143,0.84955556,356,10/7/2019 21:22,male,1,1981, -0.79142857,0.66741667,0.780375,0.81916667,356,10/8/2019 13:39,male,1,1981, -0.793625,0.80622222,0.83476923,0.74714286,356,10/8/2019 17:02,male,1,1981, -0.66128571,0.66721053,0.5675,0.61576923,357,10/8/2019 13:39,male,1,2000, -0.5365,0.6938,0.60455,0.52133333,357,10/8/2019 13:40,male,1,2000, -0.66363636,0.84676923,0.62936364,0.7265,357,10/8/2019 13:38,male,1,2000, -0.96325,0.609375,0.7729,0.66621429,358,10/8/2019 13:40,female,1,2000, -1.047,1.10666667,0.9065,1.05044444,358,10/8/2019 13:39,female,1,2000, -0.8378,0.574,0.842,0.671,358,10/8/2019 13:39,female,1,2000, -1.185,0.98025,0.943,1.08544444,359,10/8/2019 13:39,male,1,2000, -0.80733333,0.8875,0.85558824,1.153,359,10/8/2019 13:40,male,1,2000, -0.56611765,0.5336,0.62577778,0.58766667,360,10/8/2019 13:41,male,1,2000, -0.57111111,0.69016667,0.62283333,0.60292857,360,11/9/2019 14:53,male,1,2000, -0.54227273,0.66775,0.56011111,0.63825,360,11/9/2019 15:08,male,1,2000, -0.739125,0.6737,0.57847059,0.6132,360,11/11/2019 7:03,male,1,2000, -0.56609091,0.56536364,0.6026,0.54118182,360,11/5/2019 8:28,male,1,2000, -0.50130769,0.91792308,0.700625,0.5882,360,11/9/2019 15:01,male,1,2000, -0.583,0.61707143,0.52806667,0.525,360,11/9/2019 15:10,male,1,2000, -0.67346154,0.54075,0.59358333,0.56282353,360,11/7/2019 9:05,male,1,2000, -0.47590909,0.69161538,0.56193333,0.59791667,360,11/9/2019 15:03,male,1,2000, -0.48657895,0.6745,0.58718182,0.57093333,360,11/9/2019 15:13,male,1,2000, -0.6464,0.632,0.6704,0.584,360,10/8/2019 13:39,male,1,2000, -0.52476923,0.61121429,0.78533333,0.48675,360,11/8/2019 11:04,male,1,2000, -0.5046,0.71091667,0.62590909,0.5922,360,11/9/2019 15:07,male,1,2000, -0.5245,0.53654545,0.74057143,0.539,360,11/10/2019 11:39,male,1,2000, -0.72933333,0.81675,0.87275,0.8218,361,10/8/2019 13:39,female,1,2000,3 -0.7065,0.72,0.99555556,0.75466667,362,10/8/2019 13:34,male,1,2000, -0.6725,0.49746154,0.70861538,0.909125,362,10/8/2019 13:39,male,1,2000, -0.53777778,0.546,0.612,0.65090909,363,10/8/2019 13:41,male,1,2000, -0.59733333,0.83466667,0.696,0.74844444,364,10/8/2019 13:39,male,1,2000, -0.61226667,0.65706667,0.593,0.712,364,10/8/2019 13:40,male,1,2000, -0.65722222,0.778,1.14545455,0.8102,365,10/8/2019 13:40,male,1,1999, -0.76444444,0.7084,0.5848,0.71028571,366,10/8/2019 13:40,male,1,2000, -0.6939,0.86733333,0.7458125,0.682375,367,11/7/2019 7:10,female,1,1997, -0.72554545,0.6515,0.90071429,0.95575,367,10/18/2019 11:17,female,1,1997, -0.72345455,0.82842857,0.97114286,0.97666667,367,10/18/2019 20:45,female,1,1997, -0.647,0.7690625,0.81425,0.7688,367,11/8/2019 7:45,female,1,1997, -0.9425,1.646,1.177625,1.2734,367,10/17/2019 16:23,female,1,1997, -0.90271429,0.72523077,0.80988889,0.54683333,367,10/18/2019 11:28,female,1,1997, -0.715625,0.87525,0.8155,0.68761538,367,11/4/2019 6:57,female,1,1997, -0.720125,0.798375,0.72117647,0.74014286,367,11/5/2019 6:48,female,1,1997, -0.69533333,0.8004,0.66263636,0.6136,367,11/9/2019 8:02,female,1,1997, -1.62833333,1.50766667,1.40766667,1.05125,367,10/17/2019 16:40,female,1,1997, -1.43066667,1.47071429,1.05916667,1.09971429,367,10/18/2019 11:40,female,1,1997, -0.6412,0.71964286,0.80755556,0.62255556,367,11/6/2019 6:56,female,1,1997, -0.599125,0.62666667,0.68983333,0.6017,367,11/10/2019 8:55,female,1,1997, -0.658,0.64913333,0.69488889,0.758,367,10/18/2019 11:04,female,1,1997, -0.72807143,0.8117,1.06533333,0.75528571,367,10/18/2019 20:43,female,1,1997, -0.8026,0.73542857,0.7642,0.70054545,368,11/10/2019 23:55,female,1,2000, -0.6784,0.62281818,0.669125,0.57275,368,11/11/2019 0:46,female,1,2000, -0.62038462,0.835375,0.7122,0.61338462,368,11/11/2019 0:55,female,1,2000, -0.74855556,0.82466667,0.6992,0.70275,368,11/11/2019 0:06,female,1,2000, -0.99954545,0.7875,0.97466667,1.04,368,11/10/2019 23:41,female,1,2000, -0.62911111,0.65307143,0.75376923,0.628875,368,11/11/2019 0:20,female,1,2000, -0.99954545,0.7875,0.97466667,1.04,368,11/10/2019 23:41,female,1,2000, -0.965,0.97366667,0.5478125,0.54291667,368,11/11/2019 0:33,female,1,2000, -3.4745,1.4922,2.348,1.5145,369,10/8/2019 19:22,male,1,2000, -0.989375,0.94766667,0.88827273,0.66777778,369,10/8/2019 13:39,male,1,2000, -0.83125,0.65255556,0.97433333,0.68442857,369,10/8/2019 13:41,male,1,2000, -0.62863636,0.80536364,0.80033333,0.65528571,370,11/7/2019 21:44,female,1,2000,3 -2.967,2.37866667,5.9335,1.2645,370,11/4/2019 11:55,female,1,2000,3 -0.94228571,0.68026667,0.53945455,0.63618182,370,11/8/2019 15:09,female,1,2000,3 -0.89514286,1.748,1.10716667,0.786625,370,11/4/2019 11:56,female,1,2000,3 -0.7359,0.69936364,0.783,0.679,370,11/8/2019 16:37,female,1,2000,3 -0.6482,0.869,0.82273333,0.70766667,370,11/6/2019 11:27,female,1,2000,3 -0.90714286,0.5386,0.69378571,0.7365,370,11/10/2019 14:33,female,1,2000,3 -1.366,2.26057143,0.7984,0.75466667,371,10/8/2019 13:40,female,1,2000, -0.634,0.58528571,0.72325,0.65315385,371,11/5/2019 21:55,female,1,2000, -0.87214286,1.13514286,1.33042857,0.6329,371,11/5/2019 22:23,female,1,2000, -0.65075,0.88423077,0.86575,0.59575,371,11/10/2019 16:15,female,1,2000, -0.55754545,1.11025,0.44725,0.46969231,373,10/8/2019 13:40,female,1,2000, -1.232,1.5126,0.61283333,0.54953846,373,10/8/2019 13:41,female,1,2000, -0.748,0.64329412,0.736,0.754,374,10/8/2019 13:40,male,1,2000, -0.75375,0.61046154,0.88025,0.80218182,374,10/8/2019 13:41,male,1,2000, -1.0558,0.99814286,1.43842857,1.23166667,375,10/8/2019 13:40,female,1,1995, -1.36016667,0.86933333,0.99877778,1.11355556,378,10/8/2019 17:02,male,1,2000, -0.55428571,0.59257143,0.6016,0.66323077,379,11/5/2019 11:32,male,1,1999,4 -0.52371429,0.53369231,0.6105,0.54273333,379,11/8/2019 12:31,male,1,1999,4 -0.627375,0.52177778,0.60875,0.56992857,379,11/5/2019 11:34,male,1,1999,4 -0.54264286,0.553,0.56807143,0.655,379,11/9/2019 12:23,male,1,1999,4 -0.581,0.78081818,0.5455625,0.4640625,379,10/8/2019 17:02,male,1,1999,4 -0.62018182,0.59171429,0.60154545,0.56414286,379,11/6/2019 11:45,male,1,1999,4 -0.56038462,0.54815385,0.59007692,0.56353846,379,11/10/2019 13:36,male,1,1999,4 -0.611375,0.66183333,0.7009,0.74833333,379,11/4/2019 18:52,male,1,1999,4 -0.55869231,0.5685,0.61414286,0.5484,379,11/7/2019 17:03,male,1,1999,4 -1.176,1.24,1.03433333,1.164,380,10/8/2019 17:02,female,1,2000, -0.61866667,0.93033333,0.70884615,0.75741667,381,10/8/2019 17:02,male,1,2000, -0.89658333,0.93133333,0.9023,1.063,382,10/8/2019 17:03,female,1,2000, -1.11871429,1.18666667,1.22642857,1.0538,384,10/8/2019 17:02,male,1,2000, -2.00533333,1.091,1.72685714,1.1255,385,10/8/2019 17:02,female,1,2000, -0.87277778,0.93733333,1.07485714,1.083375,387,10/8/2019 17:02,female,1,2000, -0.743,4.875,2.269,5.591,388,10/8/2019 17:02,female,0,2001, -1.1,0.97466667,1.20325,0.84,390,10/8/2019 17:02,male,1,2000, -0.81244444,0.79990909,1.304,1.222875,390,10/8/2019 17:03,male,1,2000, -0.77533333,0.72266667,0.70825,0.64693333,391,10/8/2019 17:02,male,1,1999, -0.7153,0.718,0.65708333,0.80733333,392,10/8/2019 17:02,male,1,2000,3 -1.11466667,1.43633333,1.07466667,0.84725,393,10/8/2019 17:02,female,1,1999, -0.740625,0.6951,0.62957143,0.68116667,394,10/8/2019 17:02,male,1,1990, -0.558,0.5021,0.8142,0.52625,396,11/11/2019 0:32,female,1,2000, -0.688,0.592,0.72,0.658,396,10/8/2019 17:04,female,1,2000, -0.502,0.43633333,0.9104,0.706,396,11/11/2019 0:27,female,1,2000, -0.6422,0.50381818,0.788,0.58608333,396,11/11/2019 0:33,female,1,2000, -0.78366667,1.1725,0.748,0.7674,396,11/7/2019 18:21,female,1,2000, -0.57642857,0.5605,0.634,0.68828571,396,11/11/2019 0:28,female,1,2000, -0.632,0.5210625,0.57385714,0.6465,396,11/11/2019 0:29,female,1,2000, -0.55172727,0.582875,0.69877778,0.60507692,396,11/8/2019 21:33,female,1,2000, -0.60892857,0.48983333,0.70276923,0.6294,396,11/11/2019 0:31,female,1,2000, -0.56591667,0.6006875,0.84571429,0.58507692,396,11/11/2019 0:25,female,1,2000, -0.77942857,0.52475,0.54255556,0.6064,397,10/8/2019 17:02,male,1,1997, -0.5841,0.61233333,0.62911765,0.7328,398,10/8/2019 17:03,female,1,2001, -0.72685714,1.5055,0.8672,0.8528,398,10/8/2019 17:02,female,1,2001, -1.0185,0.82163636,0.8467,1.0175,402,10/14/2019 9:33,male,1,2000, -0.70206667,0.56444444,0.9722,1.34533333,402,10/14/2019 9:33,male,1,2000, -0.70058333,0.5737,0.685,0.68326667,402,10/14/2019 9:47,male,1,2000, -0.6944,0.5418,0.67,0.79545455,403,10/14/2019 9:36,male,1,2001,5 -0.54330769,0.53311111,0.6229,0.664,403,11/7/2019 17:07,male,1,2001,5 -0.6631,0.62630769,0.75627273,0.82125,403,11/6/2019 19:02,male,1,2001,5 -0.57,0.55128571,0.73475,0.59176923,403,11/10/2019 9:46,male,1,2001,5 -0.640625,0.55775,0.63407143,0.78672727,403,11/6/2019 19:14,male,1,2001,5 -0.63535714,0.62633333,0.68384615,0.6247,403,11/10/2019 10:02,male,1,2001,5 -0.63078571,0.572,0.67133333,0.61330769,403,11/6/2019 19:59,male,1,2001,5 -0.70357143,0.5165,0.67307143,0.732,403,11/10/2019 10:13,male,1,2001,5 -0.76776923,0.724625,0.78675,0.926625,404,10/14/2019 9:34,male,1,2000, -0.65421429,0.5704,0.6886,0.75144444,404,10/14/2019 9:46,male,1,2000, -0.708375,0.53928571,0.7902,0.67841667,405,10/14/2019 9:34,male,1,2000, -0.64827273,0.51564286,0.50953846,0.64185714,406,10/14/2019 9:45,male,1,2000, -0.98857143,1.1925,1.3254,0.99036364,407,10/14/2019 9:33,male,1,2000, -0.88557143,0.74166667,0.87069231,0.9215,407,11/8/2019 8:13,male,1,2000, -0.91325,0.9084,0.78908333,0.67314286,407,11/10/2019 20:12,male,1,2000, -0.7695,1.03708333,0.885,1.1642,407,10/14/2019 9:42,male,1,2000, -0.8695,1.0446,0.86116667,1.027375,407,11/9/2019 8:27,male,1,2000, -0.797625,0.80866667,0.96844444,0.77555556,407,11/6/2019 8:31,male,1,2000, -0.83628571,0.87544444,0.96257143,0.897,407,11/10/2019 19:47,male,1,2000, -0.62344444,0.848625,0.75321429,0.69955556,407,11/7/2019 8:19,male,1,2000, -0.9195,0.83681818,0.94571429,0.756125,407,11/10/2019 20:09,male,1,2000, -1.452,1.401,0.56175,1.184,408,11/5/2019 6:19,male,1,2000,4 -0.80130769,0.626,1.37457143,0.60444444,408,11/9/2019 6:32,male,1,2000,4 -0.6647,0.51333333,0.70636364,0.62452941,408,11/10/2019 9:41,male,1,2000,4 -1.6526,0.7018,0.84766667,1.02488889,408,10/14/2019 9:34,male,1,2000,4 -0.67116667,0.59815385,0.88316667,0.62123077,408,11/6/2019 6:28,male,1,2000,4 -1.083,0.5944,0.7432,0.89775,408,11/3/2019 6:24,male,1,2000,4 -1.2886,0.675,0.823,0.60233333,408,11/7/2019 6:35,male,1,2000,4 -1.025,1.5064,0.93344444,0.9452,408,11/4/2019 6:32,male,1,2000,4 -1.09825,0.66336364,0.899,0.672,408,11/8/2019 6:26,male,1,2000,4 -0.61584615,0.66728571,0.71885714,0.6959,409,11/5/2019 7:43,male,0,2000,4 -0.60961111,0.7696,0.63742857,0.6603,409,11/9/2019 7:43,male,0,2000,4 -0.58586667,0.72545455,0.5718,0.60914286,409,11/10/2019 8:23,male,0,2000,4 -0.602,0.6575,0.67916667,0.693875,409,11/6/2019 7:52,male,0,2000,4 -0.46275,0.955125,0.59628571,0.86283333,409,12/16/2019 18:22,male,0,2000,4 -0.7762,0.83425,0.90628571,1.00288889,409,10/14/2019 9:34,male,0,2000,4 -0.56576923,0.62077778,0.6483,0.69742857,409,11/7/2019 7:52,male,0,2000,4 -0.72477778,0.9182,0.6975,0.96271429,409,11/4/2019 17:04,male,0,2000,4 -0.75081818,0.9496,0.52116667,0.65055556,409,11/8/2019 7:52,male,0,2000,4 -0.84081818,0.777,0.93828571,1.00844444,410,10/14/2019 9:35,male,1,1999, -0.66115385,0.85666667,0.76355556,1.120125,411,10/14/2019 9:52,male,1,2000, -0.5855,1.004,0.5275,0.656,411,10/22/2019 19:43,male,1,2000, -0.949375,0.9126,0.74133333,0.85571429,411,11/4/2019 7:22,male,1,2000, -0.64457143,0.65671429,1.402,0.76857143,412,10/14/2019 9:48,male,1,2000, -0.7806,0.81588889,1.181,1.1277,413,10/14/2019 9:48,female,0,1999, -0.79466667,0.79,0.7849,0.85225,413,10/14/2019 9:48,female,0,1999, -0.75021429,0.779,0.78883333,0.728,413,10/14/2019 9:49,female,0,1999, -0.837,0.7385,0.77255556,0.8258,414,10/14/2019 10:01,male,1,2000, -0.57713333,0.747375,0.78781818,0.6613,415,10/14/2019 9:48,male,1,2000, -0.61777778,1.0236,0.7138,0.56333333,415,11/11/2019 2:00,male,1,2000, -0.82355556,0.78388889,0.689125,0.68935714,415,11/11/2019 2:08,male,1,2000, -0.61,0.76875,1.01366667,0.8416,415,11/4/2019 18:08,male,1,2000, -0.787,0.85316667,0.64566667,0.898,415,11/11/2019 2:01,male,1,2000, -0.95075,0.62809091,0.836625,0.8697,415,11/11/2019 2:12,male,1,2000, -0.623625,1.0465,0.758,0.93777778,415,11/5/2019 22:22,male,1,2000, -0.84385714,0.772,0.9198,0.70645455,415,11/11/2019 2:03,male,1,2000, -0.70546667,0.77485714,0.9715,0.64783333,415,11/11/2019 2:14,male,1,2000, -0.8094,0.68722222,0.6848,0.95933333,415,11/7/2019 14:31,male,1,2000, -0.87725,0.7565,0.71208333,0.67841176,415,11/11/2019 2:04,male,1,2000, -0.646,0.804,0.699,0.63509091,415,11/11/2019 2:16,male,1,2000, -0.7641,0.90188889,0.90366667,0.8389,416,10/14/2019 9:42,male,1,1996, -0.70045455,0.68855556,0.62666667,0.67466667,416,10/22/2019 1:29,male,1,1996, -0.9368,1.1258,1.12242857,0.89916667,417,10/14/2019 9:48,male,1,2000, -0.83909091,1.06285714,1.383,0.976,418,10/14/2019 9:48,male,1,2000, -0.93025,0.8846,1.00028571,0.741875,421,10/14/2019 9:48,male,1,2000, -0.65636364,0.52489474,0.66133333,0.64084615,422,11/6/2019 7:59,male,1,2000,3 -0.56535714,0.51342857,0.57185714,0.6696,422,11/11/2019 10:29,male,1,2000,3 -0.76641667,0.78,0.84558333,0.79275,422,10/14/2019 9:48,male,1,2000,3 -0.671625,0.651,0.59115,0.59777778,422,11/7/2019 8:02,male,1,2000,3 -0.52807692,0.5765,0.58038889,1.019,422,12/16/2019 19:45,male,1,2000,3 -0.747,0.6269,0.85338462,1.00328571,422,11/4/2019 8:02,male,1,2000,3 -0.57575,0.568,0.52955556,0.56971429,422,11/8/2019 8:04,male,1,2000,3 -0.71725,0.71444444,0.67005556,0.78033333,422,11/5/2019 7:49,male,1,2000,3 -0.63066667,0.58345455,0.74614286,0.66554545,422,11/11/2019 10:28,male,1,2000,3 -0.65875,0.75228571,0.81341667,0.6726,423,11/4/2019 8:11,male,1,2000, -0.57484615,0.54354545,0.6209,0.88772727,423,11/9/2019 7:57,male,1,2000, -0.64083333,0.59233333,0.60677778,0.58507692,423,11/6/2019 7:52,male,1,2000, -0.724375,0.59209091,0.61788889,0.61463158,423,11/10/2019 9:54,male,1,2000, -0.694,0.90522222,0.842,0.69115385,423,10/14/2019 9:48,male,1,2000, -0.722,0.65976923,0.60745455,0.67677778,423,11/7/2019 7:46,male,1,2000, -0.61236364,0.80177778,0.69691667,0.57423077,423,10/14/2019 9:59,male,1,2000, -0.665,0.62372727,0.74375,0.6401,423,11/8/2019 8:04,male,1,2000, -0.8034,0.9425,0.93571429,0.69716667,424,10/14/2019 9:48,male,1,2000, -0.7192,0.67235714,0.77825,0.7768,425,10/14/2019 9:49,male,1,2000, -0.8606,0.8486,0.8844,0.85211111,426,10/14/2019 13:40,male,1,2001, -0.70644444,0.72261538,0.74166667,0.62016667,426,10/14/2019 13:41,male,1,2001, -0.8685,0.85128571,0.94457143,0.84508333,427,10/14/2019 13:50,male,1,2000, -1.02814286,0.71666667,0.83366667,0.86144444,428,10/14/2019 13:39,male,1,2000, -1.77875,1.81125,1.861,1.936,429,10/20/2019 18:51,male,1,2000,4 -0.5391,0.54058333,0.582,0.59454545,429,12/17/2019 23:19,male,1,2000,4 -0.922,0.90885714,0.87388889,0.746,430,10/14/2019 13:47,male,1,2000, -0.86475,0.587,0.88436364,1.04345455,431,10/17/2019 20:37,male,1,2000, -0.841,0.822,0.551,1.126,431,11/5/2019 22:46,male,1,2000, -0.56433333,0.6315,0.678,0.818,431,11/5/2019 22:47,male,1,2000, -0.93855556,0.95933333,0.909625,1.849,431,10/14/2019 13:49,male,1,2000, -0.7028,0.584,1.2985,0.68628571,432,10/14/2019 13:44,male,0,2000, -0.81771429,0.893875,1.20275,0.82666667,433,10/14/2019 13:42,male,1,2000, -0.70318182,0.91722222,1.08275,1.05344444,433,11/7/2019 8:50,male,1,2000, -0.8694,0.85461538,0.73492308,0.8462,433,11/9/2019 8:22,male,1,2000, -0.699875,0.65357143,0.852,0.66745455,434,10/14/2019 13:41,male,1,2000, -0.895375,0.48777778,0.8795,1.01125,434,10/14/2019 13:39,male,1,2000, -0.87377778,0.737375,0.73423077,0.60236364,435,10/14/2019 13:46,male,1,2001, -1.0962,0.81183333,1.76975,0.85377778,435,10/14/2019 13:43,male,1,2001, -0.891,0.76828571,0.9173,1.003,435,10/14/2019 13:44,male,1,2001, -0.9282,0.6501,1.0436,0.8005,435,10/14/2019 13:45,male,1,2001, -1.501,0.85016667,0.84155556,1.3348,436,10/14/2019 13:47,female,1,2000, -3.56333333,1.337,1.22333333,1.3036,436,10/14/2019 13:44,female,1,2000, -1.46133333,1.667,1.2825,1.7135,436,10/14/2019 13:44,female,1,2000, -1.1322,1.1102,0.9645,1.2124,436,10/14/2019 13:46,female,1,2000, -0.90514286,0.66666667,1.14825,0.66525,437,10/14/2019 13:50,male,1,2000, -0.47907692,0.85257143,0.62830769,0.42641667,438,11/5/2019 18:04,male,1,2000,3 -0.73133333,0.94263636,0.68016667,0.75566667,438,11/9/2019 23:29,male,1,2000,3 -0.75216667,0.8511,0.54744444,0.8135,438,11/6/2019 18:40,male,1,2000,3 -0.66516667,0.61314286,0.54975,0.80342857,438,11/10/2019 22:45,male,1,2000,3 -0.729125,0.82066667,0.65276923,0.8007,438,10/14/2019 13:52,male,1,2000,3 -0.58816667,0.82233333,0.6885,0.9444,438,11/7/2019 19:51,male,1,2000,3 -0.65575,0.63277778,0.634,0.62169231,438,12/16/2019 21:01,male,1,2000,3 -0.6766,0.83325,0.88133333,0.792,438,11/4/2019 20:40,male,1,2000,3 -0.477,0.63833333,0.77877778,0.50815385,438,11/8/2019 20:34,male,1,2000,3 -0.88228571,0.683,0.823,0.681,439,11/7/2019 17:22,male,1,2000, -0.526,0.5573,0.581,0.69083333,439,11/11/2019 17:00,male,1,2000, -0.88228571,0.683,0.823,0.681,439,11/7/2019 17:22,male,1,2000, -0.5204,0.43253333,0.54525,0.61494737,439,11/11/2019 17:01,male,1,2000, -0.74127273,0.52376923,0.942,0.8452,439,11/10/2019 2:26,male,1,2000, -0.47022222,0.53775,0.65114286,0.8137,439,11/11/2019 17:02,male,1,2000, -0.81844444,0.85455556,0.68133333,0.84558333,439,10/14/2019 14:06,male,1,2000, -0.670625,0.54092308,0.51470588,0.93716667,439,11/11/2019 16:36,male,1,2000, -0.666,0.5615,0.7476,0.54416667,439,11/11/2019 16:52,male,1,2000, -0.591,0.578,0.67841667,0.70530769,440,10/14/2019 13:56,male,1,2000, -0.6516,0.53342857,0.69933333,0.58576471,440,11/10/2019 17:53,male,1,2000, -0.5768,0.596625,0.5814375,0.6382,440,11/10/2019 18:02,male,1,2000, -0.53629412,0.527875,0.61717647,0.646,440,11/10/2019 18:04,male,1,2000, -0.56692308,0.534,0.62975,0.68214286,440,10/23/2019 2:22,male,1,2000, -0.57244444,0.511,0.69526667,0.61325,440,11/10/2019 17:57,male,1,2000, -0.57325,0.50666667,0.78315385,0.67873333,440,10/23/2019 14:51,male,1,2000, -0.5185,0.56278261,0.77714286,0.64025,440,11/10/2019 17:59,male,1,2000, -0.6555,0.50366667,0.693,0.59833333,440,10/14/2019 13:52,male,1,2000, -0.63125,0.54857143,0.67625,0.74941667,440,11/10/2019 17:20,male,1,2000, -0.6775,0.513,0.638,0.56942857,440,11/10/2019 18:00,male,1,2000, -1.745,1.2065,1.5545,1.371,441,10/14/2019 13:52,male,1,2000, -0.80445455,0.92266667,0.74963636,0.9138,442,10/14/2019 13:54,female,1,2000, -1.451,0.9985,0.8288,0.60241667,443,10/14/2019 13:52,male,1,1999,3 -0.60471429,0.6407,0.64471429,0.6275,443,12/17/2019 2:03,male,1,1999,3 -0.86525,0.73655556,1.13285714,0.87933333,444,10/14/2019 13:52,male,1,2000, -0.69233333,0.76909091,0.66941667,0.6172,445,11/6/2019 14:09,male,1,2000, -0.612875,0.76690909,0.62409091,0.80466667,445,11/7/2019 10:27,male,1,2000, -0.61633333,0.7065,0.656,0.78,445,11/8/2019 17:45,male,1,2000, -0.76922222,0.88966667,0.93466667,0.9038,445,10/14/2019 13:53,male,1,2000, -0.69683333,0.5971,0.86353846,1.053375,446,11/4/2019 19:41,male,1,2000,4 -0.77908333,0.43376923,0.90475,1.0188,446,11/11/2019 8:00,male,1,2000,4 -0.7363,0.53788889,0.67583333,0.60893333,446,11/6/2019 9:59,male,1,2000,4 -0.55023077,0.59555556,0.785,0.8015,446,12/16/2019 23:47,male,1,2000,4 -0.785,0.7695,1.447,1.08,446,11/11/2019 7:54,male,1,2000,4 -0.6765,0.60977778,0.7689,0.76484615,446,10/14/2019 13:54,male,1,2000,4 -0.76333333,0.5865,1.031,0.85,446,11/11/2019 7:55,male,1,2000,4 -0.842,0.8585,0.85555556,0.85211111,447,11/7/2019 1:30,female,1,2000, -0.8138,0.807875,0.76845455,0.76064286,447,11/10/2019 20:11,female,1,2000, -1.00328571,1.13175,1.14666667,0.743,447,11/7/2019 4:54,female,1,2000, -0.85757143,0.6538,0.63866667,0.592,447,11/10/2019 20:53,female,1,2000, -0.92828571,1.0418,1.10875,1.034875,447,10/14/2019 13:53,female,1,2000, -0.74116667,0.6822,0.83,0.952625,447,11/8/2019 7:26,female,1,2000, -1.09333333,0.851,1.3575,1.108,447,11/4/2019 8:58,female,1,2000, -0.985625,0.79472727,0.85233333,0.7526,447,11/9/2019 7:36,female,1,2000, -0.98145455,1.16466667,1.0886,1.052,448,10/21/2019 18:25,male,1,2000,3 -0.76933333,0.63918182,0.73688889,0.8613,448,11/6/2019 7:42,male,1,2000,3 -0.678375,0.645625,0.7125,0.55678571,448,11/10/2019 9:38,male,1,2000,3 -1.25066667,1.16985714,1.0875,1.1698,448,10/21/2019 19:50,male,1,2000,3 -0.57285714,0.6322,0.81366667,1.08271429,448,11/7/2019 7:18,male,1,2000,3 -0.69033333,0.7578,0.872,0.783125,448,12/16/2019 21:36,male,1,2000,3 -1.5126,4.92066667,1.375,1.15266667,448,10/14/2019 13:52,male,1,2000,3 -0.8839,0.8335,0.752,1.13133333,448,11/4/2019 9:08,male,1,2000,3 -0.74983333,0.70918182,0.843125,1.02533333,448,11/8/2019 8:09,male,1,2000,3 -0.894875,1.3456,1.1038,1.11444444,448,10/21/2019 13:23,male,1,2000,3 -0.68154545,0.7827,0.70277778,0.92044444,448,11/5/2019 7:53,male,1,2000,3 -0.67978571,0.6168,0.94428571,0.709,448,11/9/2019 6:58,male,1,2000,3 -1.764,1.6086,0.875,1.40433333,449,10/18/2019 1:51,male,1,1999,4 -0.59814286,0.83428571,0.760375,0.9532,449,11/5/2019 12:06,male,1,1999,4 -0.61453846,0.65857143,0.54726667,0.66369231,450,10/16/2019 9:47,male,0,2001, -0.53376923,0.6752,0.62583333,0.66923077,450,10/22/2019 22:46,male,0,2001, -0.48185,0.672,0.53475,0.50441667,451,10/16/2019 10:03,male,1,2000, -0.57827273,0.591625,0.66485714,0.53929412,451,10/16/2019 9:47,male,1,2000, -0.5401,0.62445455,0.53705556,0.57385714,451,10/16/2019 9:55,male,1,2000, -0.62326667,0.5675,0.761125,0.7577,452,10/16/2019 9:48,male,1,1997, -0.65725,0.69436364,0.9262,0.9296,453,10/16/2019 9:56,male,1,2000, -0.51944444,0.37463636,0.56685714,0.5964,454,11/10/2019 15:19,male,0,2000, -0.8095,0.4435,0.484,0.5756,454,11/10/2019 15:13,male,0,2000, -0.68833333,0.82066667,0.5915,0.933125,454,11/10/2019 15:14,male,0,2000, -0.95177778,0.549125,0.42084615,0.658,454,11/10/2019 15:32,male,0,2000, -0.6905,1.307,0.666,1.856,454,11/10/2019 15:17,male,0,2000, -0.58688889,0.61764286,0.71018182,0.41946667,454,11/10/2019 15:33,male,0,2000, -0.4965,1.003,0.414,0.1385,454,11/10/2019 15:18,male,0,2000, -0.63111111,0.7562,0.6908,1.224625,454,10/16/2019 9:40,male,0,2000, -1.015,0.937,0.679,0.802,455,11/7/2019 13:11,male,1,2000, -0.807,0.8645,1.025,0.865,455,11/9/2019 7:17,male,1,2000, -0.6812,0.57957143,0.671375,0.5686,455,10/16/2019 9:43,male,1,2000, -0.7304375,1.089,0.90633333,0.90975,456,10/16/2019 9:40,male,0,2000, -0.768125,0.67436364,0.79641667,0.741,456,10/16/2019 9:41,male,0,2000, -0.65923077,0.78883333,0.59942857,0.58325,457,10/16/2019 9:44,male,1,2000, -0.79685714,0.97783333,0.934125,0.9955,458,10/16/2019 9:42,male,1,2000, -0.68875,0.81918182,0.68216667,0.60383333,459,10/16/2019 9:42,male,1,2000, -0.60138462,0.63818182,0.4709375,0.53790909,460,11/5/2019 18:18,male,1,2001, -0.5213125,0.43006667,0.4416,0.58728571,460,11/6/2019 18:17,male,1,2001, -0.7524,0.56057143,0.53018182,0.5134375,460,11/10/2019 13:00,male,1,2001, -0.86228571,0.4785,0.4416875,0.48216667,460,11/5/2019 18:23,male,1,2001, -0.59152941,0.52566667,0.4740625,0.63,460,11/10/2019 12:49,male,1,2001, -0.61225,0.78657143,0.4686,0.47,460,11/10/2019 13:02,male,1,2001, -0.49283333,0.63153333,0.41105882,0.37315,460,11/6/2019 18:08,male,1,2001, -0.5085,0.43768421,0.47225,0.552625,460,11/10/2019 12:52,male,1,2001, -0.5584375,0.52408333,0.4826875,0.58083333,460,11/10/2019 13:04,male,1,2001, -0.65954545,0.68583333,0.60822222,0.62171429,460,10/16/2019 9:45,male,1,2001, -0.5688125,0.60533333,0.4808125,0.48708333,460,11/6/2019 18:14,male,1,2001, -0.4225,0.47864706,0.88688889,0.45376923,460,11/10/2019 12:58,male,1,2001, -0.74557143,0.685625,0.74427273,0.95981818,462,11/4/2019 18:57,female,1,2000,4 -0.728875,0.818875,0.702,0.69293333,462,11/8/2019 19:05,female,1,2000,4 -0.83366667,0.779,0.7462,0.8092,462,11/5/2019 19:06,female,1,2000,4 -0.74575,0.7602,0.70038462,0.874125,462,11/9/2019 21:00,female,1,2000,4 -0.66941667,0.911,0.64546154,0.80066667,462,11/6/2019 19:03,female,1,2000,4 -0.69125,0.68915385,0.668,0.70915385,462,11/10/2019 18:09,female,1,2000,4 -0.75071429,0.801,0.6936,0.87258333,462,10/16/2019 9:45,female,1,2000,4 -0.9815,0.837,0.75371429,0.67072727,462,11/7/2019 19:11,female,1,2000,4 -0.7274,0.56383333,0.68857143,0.7405,463,10/16/2019 9:44,male,1,2000, -0.68877778,0.67307692,0.65055556,1.52333333,464,11/6/2019 9:22,male,0,2001,4 -0.603375,1.02566667,0.595,0.713,464,11/10/2019 12:20,male,0,2001,4 -0.66188889,0.8718,0.66414286,0.81342857,464,10/16/2019 9:48,male,0,2001,4 -0.67444444,0.6805,0.62952941,0.67109091,464,11/7/2019 8:35,male,0,2001,4 -0.5865,0.6146,0.5446,0.584,464,12/19/2019 17:43,male,0,2001,4 -0.6279375,0.73753846,0.627125,0.74271429,464,11/4/2019 8:20,male,0,2001,4 -0.81966667,0.77228571,0.6995,0.81266667,464,11/8/2019 7:08,male,0,2001,4 -0.59627273,0.67584615,0.68554545,0.6879,464,11/5/2019 8:24,male,0,2001,4 -0.58881818,0.66663636,0.58958333,0.56325,464,11/9/2019 10:54,male,0,2001,4 -0.8089,0.80888889,0.74661538,1.1005,465,10/16/2019 9:42,male,1,2000, -1.1272,1.0198,1.585,1.2068,466,10/16/2019 9:59,male,1,2000, -1.03233333,0.98385714,1.65283333,8.336,466,10/16/2019 9:42,male,1,2000, -1.151,0.991,0.966,0.8465,467,10/16/2019 9:48,male,0,2000, -1.0142,1.25525,2.022,1.107,467,10/22/2019 18:32,male,0,2000, -0.455,0.53011765,0.44975,0.50753846,468,10/16/2019 9:48,male,1,2000, -0.51607692,0.54975,0.44489474,0.49291667,468,10/16/2019 9:47,male,1,2000, -0.564,0.64836364,0.74508333,0.61258333,469,10/16/2019 9:49,male,1,2000, -0.44525,0.44541667,0.75454545,0.579,469,10/16/2019 9:50,male,1,2000, -0.728625,0.4886,0.718,0.73426667,470,10/16/2019 9:48,male,1,2000, -0.673,0.74533333,0.73830769,0.86875,471,10/16/2019 9:46,male,1,2000, -1.08566667,1.001,0.78036364,1.04183333,472,11/6/2019 7:41,male,1,2000,3 -0.961,1.289,0.61933333,0.744,472,11/10/2019 11:53,male,1,2000,3 -0.516,0.52775,0.53511111,0.52261538,472,10/16/2019 9:49,male,1,2000,3 -0.75554545,0.98742857,0.89911111,1.01466667,472,11/7/2019 7:42,male,1,2000,3 -0.889,0.83945455,1.245,1.09575,472,12/11/2019 23:18,male,1,2000,3 -0.76527273,0.647,0.8881,0.68377778,472,11/4/2019 7:34,male,1,2000,3 -0.908,0.67557143,0.8812,1.31514286,472,11/8/2019 7:49,male,1,2000,3 -0.758,0.793,1.05371429,1.52028571,472,11/5/2019 7:29,male,1,2000,3 -0.63786667,0.5815,0.8095,0.83922222,472,11/9/2019 8:01,male,1,2000,3 -1.0282,0.674,0.91377778,0.88822222,474,11/7/2019 8:20,male,1,2001, -1.00681818,0.65145455,0.81266667,0.78227273,474,11/10/2019 18:10,male,1,2001, -1.08714286,0.64633333,0.805,0.94557143,474,11/8/2019 7:57,male,1,2001, -1.01,0.939,0.9465,1.00216667,474,10/16/2019 9:47,male,1,2001, -1.02522222,0.7185,0.75633333,0.893625,474,11/9/2019 7:47,male,1,2001, -1.311,0.68066667,0.78,1.43,474,11/5/2019 8:14,male,1,2001, -0.85214286,0.77166667,0.69646154,0.54583333,474,11/10/2019 9:37,male,1,2001, -0.6295,0.53358824,0.67026667,0.66575,475,11/6/2019 9:33,male,1,2001, -0.52408333,0.61975,0.64757143,0.666,475,11/10/2019 15:48,male,1,2001, -0.73883333,0.81333333,0.72883333,0.78166667,475,10/16/2019 9:43,male,1,2001, -0.58808333,0.56636364,0.68472727,0.665,475,11/7/2019 7:33,male,1,2001, -0.752,0.77490909,0.83822222,0.820875,475,10/20/2019 11:48,male,1,2001, -0.59858333,0.58621429,0.66416667,0.70366667,475,11/8/2019 7:54,male,1,2001, -0.71385714,0.5685625,0.72409091,0.908,475,11/5/2019 7:07,male,1,2001, -0.59933333,0.59869231,0.63777778,0.63464286,475,11/9/2019 11:48,male,1,2001, -0.65745455,0.70525,0.61213333,0.63075,476,11/9/2019 13:44,male,1,2000, -0.584,0.62107143,0.6775,0.672,476,11/9/2019 13:45,male,1,2000, -1.165,0.85677778,0.78509091,0.93857143,476,11/8/2019 19:56,male,1,2000, -0.79533333,0.795625,0.832,0.91271429,476,11/9/2019 13:46,male,1,2000, -0.766125,0.72475,0.7253,0.687,476,11/8/2019 19:59,male,1,2000, -0.6785,0.652,0.64106667,0.68963636,476,11/9/2019 13:47,male,1,2000, -0.79490909,0.59772727,0.8717,0.93533333,476,11/8/2019 20:00,male,1,2000, -1.05911111,0.56366667,0.89033333,0.7949,477,10/19/2019 20:08,male,1,1998, -1.04366667,0.87166667,1.03466667,0.83166667,477,11/6/2019 1:14,male,1,1998, -0.68775,0.61863636,0.65291667,0.64735714,478,11/5/2019 7:38,male,1,2000,3 -0.5915,0.6264,0.83075,0.69414286,478,11/9/2019 7:55,male,1,2000,3 -0.631,0.53818182,0.578375,0.6135,478,11/6/2019 7:46,male,1,2000,3 -0.7176,0.59,0.5774,0.94122222,478,11/10/2019 8:02,male,1,2000,3 -0.80690909,0.70881818,0.737125,0.74977778,478,10/19/2019 14:07,male,1,2000,3 -0.56645455,0.56523077,0.56636364,0.52777778,478,11/7/2019 8:07,male,1,2000,3 -0.6205,0.61775,0.73073333,0.71190909,478,11/4/2019 7:49,male,1,2000,3 -0.59966667,0.55444444,0.67041667,0.762,478,11/8/2019 8:01,male,1,2000,3 -0.859,0.84885714,0.91090909,0.7796,480,11/5/2019 11:49,female,1,2000,3 -0.82025,0.88863636,0.80569231,0.67533333,480,11/9/2019 8:15,female,1,2000,3 -0.7166,0.84883333,0.8058125,0.61815385,480,11/6/2019 8:22,female,1,2000,3 -0.7345,0.832,1.036,0.79663636,480,11/10/2019 12:34,female,1,2000,3 -1.09125,1.368,0.97033333,1.165,480,10/20/2019 20:41,female,1,2000,3 -0.74525,0.79428571,0.65392857,0.92966667,480,11/7/2019 11:54,female,1,2000,3 -1.071,0.813,0.97342857,0.96283333,480,11/4/2019 11:45,female,1,2000,3 -0.71228571,0.81654545,0.8212,0.83533333,480,11/8/2019 8:22,female,1,2000,3 -0.72516667,0.85488889,0.856,0.75185714,481,10/22/2019 12:49,male,1,2000, -1.08516667,1.04755556,0.97266667,1.1069,481,10/22/2019 13:08,male,1,2000, -0.69176923,0.63506667,0.81375,0.97775,481,10/22/2019 11:49,male,1,2000, -1.3926,1.96466667,1.72266667,1.412,481,10/22/2019 13:26,male,1,2000, -0.6475,0.63955556,0.7142,0.79630769,481,10/22/2019 12:33,male,1,2000, -1.34057143,1.019,0.69553846,0.75958333,482,11/5/2019 7:01,female,1,1999, -0.78466667,0.60481818,0.72864286,0.5862,482,11/9/2019 6:37,female,1,1999, -0.9209,0.75116667,0.79557143,0.64477778,482,11/6/2019 7:16,female,1,1999, -0.83833333,0.737125,0.72721429,0.67811111,482,11/10/2019 8:41,female,1,1999, -0.66035294,1.0336,0.86011111,0.70025,482,11/7/2019 7:02,female,1,1999, -0.80783333,0.95266667,0.83109091,0.64972727,482,11/4/2019 6:48,female,1,1999, -0.96371429,0.694,0.6375,0.763,482,11/8/2019 7:22,female,1,1999, -0.8554,0.85333333,0.9854,1.5704,484,10/21/2019 16:21,male,1,2000, -0.886,0.77111111,0.770875,0.646,484,11/7/2019 8:50,male,1,2000, -0.95066667,0.725625,1.2585,1.14133333,484,11/4/2019 22:56,male,1,2000, -0.69283333,0.69475,0.92388889,0.7588,484,11/8/2019 8:56,male,1,2000, -1.07266667,2.066,1.67616667,1.9486,484,10/19/2019 20:42,male,1,2000, -0.6864,0.72333333,0.77444444,1.15775,484,11/5/2019 10:14,male,1,2000, -1.18725,0.58914286,0.82428571,0.88116667,484,11/10/2019 13:05,male,1,2000, -1.56775,0.74985714,1.047,1.31871429,484,10/19/2019 20:42,male,1,2000, -0.68125,0.6246,0.84433333,0.8573,484,11/6/2019 8:20,male,1,2000, -0.777,0.54325,0.62125,0.80425,484,11/11/2019 2:19,male,1,2000, -0.96233333,0.98385714,0.80455556,0.94414286,485,11/7/2019 8:14,male,0,2001,3 -0.92033333,0.84933333,0.77633333,0.96066667,485,10/18/2019 15:55,male,0,2001,3 -0.94511111,0.87271429,0.95481818,0.8035,485,11/8/2019 8:12,male,0,2001,3 -0.98442857,0.95828571,0.85533333,0.887,485,11/4/2019 8:36,male,0,2001,3 -0.83354545,0.8395,1.036125,0.88116667,485,11/5/2019 10:24,male,0,2001,3 -0.75035714,0.923375,0.68233333,0.77242857,485,11/9/2019 7:48,male,0,2001,3 -1.04577778,0.8858,0.9995,0.83528571,485,11/6/2019 8:21,male,0,2001,3 -0.6808,0.76566667,0.70646667,0.8417,485,11/10/2019 12:21,male,0,2001,3 -0.618,0.69415789,0.77666667,0.8184,486,10/16/2019 13:39,male,1,2000, -1.0431,0.78171429,0.77744444,0.8755,487,11/10/2019 18:12,male,1,2000,4 -0.76744444,0.6,0.754,0.71081818,487,11/10/2019 18:20,male,1,2000,4 -2.28125,0.70866667,1.064,0.91955556,487,10/16/2019 13:39,male,1,2000,4 -0.6168,0.65075,0.75728571,0.7729,487,11/10/2019 18:16,male,1,2000,4 -0.57073333,0.5594,0.5303125,0.59941667,487,11/10/2019 18:21,male,1,2000,4 -0.8977,0.81045455,0.870625,0.9584,487,10/16/2019 13:53,male,1,2000,4 -0.67083333,0.644375,0.661,0.61892857,487,11/10/2019 18:18,male,1,2000,4 -0.619,0.84572727,0.60976923,0.74055556,487,11/10/2019 18:22,male,1,2000,4 -0.8992,0.64215385,0.70525,0.53,487,10/17/2019 19:27,male,1,2000,4 -0.61458333,0.629375,0.76491667,0.74154545,487,11/10/2019 18:19,male,1,2000,4 -0.6385,0.658125,0.67345455,0.7455,488,10/16/2019 13:40,male,1,2000,4 -0.67081818,0.71391667,0.58746154,0.66233333,488,11/8/2019 10:02,male,1,2000,4 -0.73566667,0.8,0.69377778,0.69173333,488,11/4/2019 7:56,male,1,2000,4 -0.63625,0.813875,0.59890909,0.70391667,488,11/8/2019 10:04,male,1,2000,4 -0.6618,0.78836364,0.69721429,0.69928571,488,11/5/2019 9:53,male,1,2000,4 -0.72169231,0.69953846,0.653,0.67666667,488,11/10/2019 11:24,male,1,2000,4 -0.6898,0.70113333,0.76172727,0.8174,488,10/16/2019 13:39,male,1,2000,4 -0.56866667,0.71266667,0.64823077,0.6582,488,11/6/2019 18:54,male,1,2000,4 -0.61982353,0.63455556,0.6467,0.637,488,11/10/2019 11:26,male,1,2000,4 -0.47984615,0.57022727,0.46933333,0.5127,489,11/7/2019 15:17,female,1,2000,3 -0.6464,0.57192308,0.56209091,0.67678571,489,11/10/2019 15:47,female,1,2000,3 -1.2116,0.89966667,1.194,1.03625,489,10/16/2019 13:45,female,1,2000,3 -0.69825,0.62309091,0.74,0.7945,489,10/17/2019 12:47,female,1,2000,3 -0.97585714,0.714,0.75033333,0.75442857,489,11/8/2019 19:50,female,1,2000,3 -0.59875,0.6756,0.60515,0.745,489,12/11/2019 22:40,female,1,2000,3 -1.158125,0.958125,1.263,0.77,489,10/16/2019 13:46,female,1,2000,3 -0.611,0.67266667,0.59091667,0.80178571,489,11/4/2019 9:21,female,1,2000,3 -0.67072727,0.598125,0.5686,0.56905882,489,11/5/2019 17:39,female,1,2000,3 -0.89016667,0.67272727,0.81871429,0.86842857,489,11/9/2019 17:40,female,1,2000,3 -0.891,0.92157143,0.928625,0.7168,489,10/16/2019 13:47,female,1,2000,3 -0.994,0.61813333,0.75622222,0.79155556,489,11/6/2019 20:34,female,1,2000,3 -0.89016667,0.67272727,0.81871429,0.86842857,489,11/9/2019 17:40,female,1,2000,3 -0.7848,0.653,0.7156,0.95777778,489,10/17/2019 12:45,female,1,2000,3 -0.62836364,0.68926667,0.6095,0.58476923,490,11/5/2019 8:34,male,0,2001,3 -0.51653333,0.56642857,0.5050625,0.47507692,490,11/9/2019 8:02,male,0,2001,3 -0.58869231,0.54833333,0.60246154,0.56646154,490,11/6/2019 19:20,male,0,2001,3 -0.40964706,0.47353846,0.4590625,0.48484211,490,11/10/2019 10:23,male,0,2001,3 -0.71969231,0.98185714,0.777625,0.6915,490,10/16/2019 13:40,male,0,2001,3 -0.54264286,0.59333333,0.55455556,0.52291667,490,11/7/2019 20:20,male,0,2001,3 -0.67435294,1.13366667,0.67622222,0.667625,490,11/4/2019 7:12,male,0,2001,3 -0.4926875,0.47613333,0.4863125,0.49055556,490,11/8/2019 8:27,male,0,2001,3 -0.72433333,0.6586,0.781,0.869,492,10/16/2019 13:45,female,1,2001,3 -0.6595,0.6315,0.77166667,0.69444444,492,11/7/2019 8:06,female,1,2001,3 -0.62553333,0.65269231,0.607,0.59469231,492,11/10/2019 10:55,female,1,2001,3 -0.77442857,0.70873333,0.816,0.8,492,11/4/2019 7:04,female,1,2001,3 -0.99,0.8095,0.991,0.78133333,492,11/8/2019 7:41,female,1,2001,3 -1.27,0.94444444,1.01233333,0.9994,492,10/16/2019 13:43,female,1,2001,3 -0.56961538,0.711,0.65025,0.71433333,492,11/5/2019 9:36,female,1,2001,3 -0.6874,0.65636364,0.7225,0.6522,492,11/8/2019 7:42,female,1,2001,3 -0.744,0.636,0.726,1.90866667,492,10/16/2019 13:44,female,1,2001,3 -0.79541667,0.66190909,0.761,0.748,492,11/6/2019 6:30,female,1,2001,3 -0.70585714,0.7174375,0.76355556,0.69988889,492,11/9/2019 6:27,female,1,2001,3 -0.73961538,0.59528571,1.10666667,0.836,493,10/16/2019 13:43,male,1,2000, -0.56981818,0.5995,0.8189,0.59744444,493,10/16/2019 13:44,male,1,2000, -0.9639,1.089,0.78616667,0.87254545,494,11/4/2019 17:52,female,1,2000,3 -0.68985714,0.71566667,0.72875,0.56983333,494,11/8/2019 21:44,female,1,2000,3 -0.61066667,0.623125,0.70178571,0.63042857,494,11/5/2019 18:08,female,1,2000,3 -0.64676471,0.62841667,0.807,0.62257143,494,11/9/2019 19:41,female,1,2000,3 -0.95825,0.53276471,0.70077778,0.683,494,11/6/2019 17:55,female,1,2000,3 -0.627,0.64855556,0.61753846,0.52368421,494,11/10/2019 12:28,female,1,2000,3 -0.749,1.202,0.81266667,0.86691667,494,10/16/2019 13:43,female,1,2000,3 -1.10333333,0.64611111,0.8897,0.74042857,494,11/7/2019 18:30,female,1,2000,3 -0.7795,0.74757143,0.74471429,0.83425,495,10/16/2019 13:48,male,1,2000,5 -0.64457143,0.76266667,0.7436,0.803,495,11/11/2019 6:49,male,1,2000,5 -0.5558,0.61325,0.89075,0.58133333,495,11/15/2019 8:21,male,1,2000,5 -0.59914286,0.768,0.93275,0.8955,495,11/4/2019 8:17,male,1,2000,5 -0.60785714,0.73,0.907,1.02633333,495,11/12/2019 8:21,male,1,2000,5 -0.53611111,0.58553846,0.6482,0.639,495,11/16/2019 8:22,male,1,2000,5 -0.80588889,0.55111765,0.9415,0.59891667,495,11/5/2019 8:30,male,1,2000,5 -0.67607143,0.7808,0.83166667,0.76616667,495,11/13/2019 8:58,male,1,2000,5 -0.566,0.63184615,0.60927273,0.4814,495,11/17/2019 11:55,male,1,2000,5 -0.69311111,0.72566667,0.59555556,0.922,495,10/16/2019 13:39,male,1,2000,5 -0.76066667,0.68057143,0.8695,0.578,495,11/6/2019 8:49,male,1,2000,5 -0.5634,0.612125,0.82116667,0.7455,495,11/14/2019 8:35,male,1,2000,5 -0.72661538,0.77866667,0.85516667,0.72354545,496,10/16/2019 13:46,female,1,2000,0 -0.7428,0.6055,0.7405,0.61685714,496,11/6/2019 8:34,female,1,2000,0 -0.82444444,1.02444444,0.75714286,0.71427273,496,11/10/2019 6:54,female,1,2000,0 -0.77057143,0.62442105,0.92866667,0.842125,496,11/4/2019 8:15,female,1,2000,0 -0.57278571,0.60244444,0.7285,0.8982,496,11/7/2019 8:01,female,1,2000,0 -0.67625,0.537875,1.1015,0.55233333,496,11/5/2019 8:47,female,1,2000,0 -0.991,0.724,0.53457143,0.7575,496,11/8/2019 7:58,female,1,2000,0 -0.877,1.1155,0.8274,0.91253846,496,10/16/2019 13:44,female,1,2000,0 -0.54790909,0.71525,0.6648,0.75071429,496,11/5/2019 8:48,female,1,2000,0 -0.75692308,0.8545,0.71321429,0.594,496,11/9/2019 7:51,female,1,2000,0 -0.739,0.816875,0.59475,0.744,497,11/8/2019 15:06,male,1,2000, -0.884875,0.83033333,1.13475,1.33225,497,10/16/2019 13:38,male,1,2000, -0.74977778,0.73814286,0.7671,0.87127273,497,11/5/2019 8:28,male,1,2000, -0.6936,0.77942857,0.6225,1.19027273,497,11/8/2019 15:24,male,1,2000, -0.743,0.86225,0.59630769,0.73513333,497,11/6/2019 9:08,male,1,2000, -0.63366667,0.67775,0.6114,0.51393333,498,10/16/2019 13:39,male,1,2000, -0.79444444,0.778625,0.99588889,0.924,499,10/16/2019 13:38,male,1,2001, -0.56655556,0.760875,0.72528571,0.6953,499,10/16/2019 13:39,male,1,2001, -1.53633333,0.6045,0.91125,0.78766667,500,10/16/2019 13:38,male,1,2000, -0.78709091,0.68476923,0.667875,0.6633,501,10/16/2019 13:38,male,1,2000, -0.57491667,0.63545455,0.7018,0.73666667,501,11/7/2019 8:04,male,1,2000, -0.5687,1.00966667,0.5794,0.70766667,501,11/4/2019 7:01,male,1,2000, -0.6392,0.71975,0.74475,0.741,501,11/8/2019 7:13,male,1,2000, -0.58313333,0.64057143,0.684,0.60763636,501,11/5/2019 9:17,male,1,2000, -0.75042857,0.69773333,0.7138,0.75311111,501,11/9/2019 7:27,male,1,2000, -0.63333333,0.71316667,0.71363636,0.60284615,501,11/6/2019 8:45,male,1,2000, -0.56745455,0.6646,0.6454,0.63175,501,11/10/2019 21:54,male,1,2000, -0.61830769,0.72,0.63811111,0.73655556,502,10/16/2019 13:38,male,1,1920, -0.61722222,0.801,0.7636,0.6735,503,11/6/2019 10:00,male,1,2000, -0.903,0.709,0.93771429,0.77485714,503,11/4/2019 7:53,male,1,2000, -0.769,0.61172727,0.77025,0.68914286,503,11/7/2019 11:04,male,1,2000, -0.8351,0.69735714,0.7187,0.7838,503,11/4/2019 8:09,male,1,2000, -0.73736364,0.76990909,0.7115,0.63933333,503,11/8/2019 7:33,male,1,2000, -0.787375,0.6815,0.95083333,0.70825,503,11/4/2019 22:27,male,1,2000, -0.61775,0.6431,0.821,0.537875,503,11/10/2019 9:00,male,1,2000, -1.094,1.21272727,1.01533333,0.92911111,505,10/16/2019 13:40,male,1,2000, -0.75475,0.823,0.749625,0.84525,505,10/22/2019 14:14,male,1,2000, -0.7475,1.15925,1.51716667,1.0355,505,11/5/2019 10:46,male,1,2000, -0.924375,0.85228571,0.89890909,0.7475,505,11/6/2019 10:11,male,1,2000, -0.65742857,0.66053846,0.70272727,0.71775,506,10/16/2019 13:44,male,1,2000,2 -0.519,0.62581818,0.56981818,0.62464286,506,11/7/2019 8:01,male,1,2000,2 -0.895,0.649875,0.650125,0.61236364,506,11/4/2019 8:03,male,1,2000,2 -0.67966667,0.5822,0.71975,0.69725,506,11/8/2019 8:10,male,1,2000,2 -0.6718,0.6975,0.6568,0.54375,506,11/5/2019 8:11,male,1,2000,2 -0.55111765,0.45064286,0.60155556,0.544375,506,11/9/2019 10:38,male,1,2000,2 -0.6844,0.54947619,0.67375,0.6042,506,11/6/2019 8:14,male,1,2000,2 -0.6815,0.768,0.57853333,0.60783333,506,11/10/2019 8:14,male,1,2000,2 -0.926,1.17975,1.08066667,1.1565,507,10/16/2019 13:42,male,1,2000,3 -0.509,0.55714286,0.4832,0.559625,507,10/21/2019 21:46,male,1,2000,3 -2.09957143,1.80575,1.7215,2.2765,507,10/21/2019 23:34,male,1,2000,3 -1.02,0.62126667,0.714,0.67409091,507,11/6/2019 16:04,male,1,2000,3 -0.933625,0.61583333,0.96172727,0.88055556,507,10/21/2019 20:08,male,1,2000,3 -0.483,0.5106,0.58606667,0.6295,507,10/21/2019 21:58,male,1,2000,3 -0.77472727,1.07228571,0.75333333,0.7086,507,11/4/2019 22:08,male,1,2000,3 -0.74925,0.92888889,0.64216667,0.974875,507,11/7/2019 8:13,male,1,2000,3 -0.61466667,0.58069231,0.70127273,0.6275,507,10/21/2019 20:46,male,1,2000,3 -1.388,1.1062,1.309,1.3505,507,10/21/2019 22:09,male,1,2000,3 -0.98266667,0.715,0.68325,0.73,507,11/5/2019 22:32,male,1,2000,3 -0.62133333,0.697,0.74877778,0.752,507,11/8/2019 8:02,male,1,2000,3 -0.4945,0.572,0.65316667,0.63688235,507,10/21/2019 21:23,male,1,2000,3 -1.791,2.15466667,1.45,2.406,507,10/21/2019 23:11,male,1,2000,3 -0.84784615,0.85577778,0.694625,0.8655,507,11/6/2019 15:58,male,1,2000,3 -0.64911111,0.836,0.5993125,0.626,507,11/9/2019 8:01,male,1,2000,3 -1.2421,0.805,0.85583333,0.98844444,508,10/16/2019 13:39,male,1,2001, -0.58707692,0.72990909,0.82571429,0.826,508,11/7/2019 8:31,male,1,2001, -0.74533333,0.67922222,0.74988889,0.82811111,508,11/4/2019 8:06,male,1,2001, -0.68046667,0.56366667,0.647,0.76357143,508,11/8/2019 7:16,male,1,2001, -0.72309091,0.58555556,0.76692308,0.6389,508,11/5/2019 8:57,male,1,2001, -0.78216667,0.5334,0.80083333,0.74407143,508,11/9/2019 8:05,male,1,2001, -0.7884,0.826875,0.98222222,0.78758333,508,11/6/2019 8:46,male,1,2001, -0.5485,0.526125,0.7755,0.74576923,508,11/10/2019 10:08,male,1,2001, -0.729875,0.5965,0.65027273,0.6257619,509,10/16/2019 13:41,male,1,2000, -0.47078947,0.47670588,0.4605,0.53046154,510,11/6/2019 9:28,male,1,2000,4 -0.508,0.46745,0.5112,0.5330625,510,12/17/2019 21:55,male,1,2000,4 -0.59916667,0.56471429,0.58346154,0.58190909,510,10/23/2019 0:11,male,1,2000,4 -0.55063636,0.54464286,0.48378947,0.44907143,510,11/7/2019 8:01,male,1,2000,4 -0.565,0.5380625,0.49922222,0.5002,510,11/4/2019 7:38,male,1,2000,4 -0.49176471,0.4388125,0.50608333,0.481,510,11/8/2019 7:33,male,1,2000,4 -0.559,0.47618182,0.49028571,0.46718182,510,11/5/2019 9:19,male,1,2000,4 -0.5675,0.464125,0.498,0.557,510,11/9/2019 7:34,male,1,2000,4 -1.07175,1.23516667,1.143875,1.33016667,511,10/22/2019 10:53,male,1,2000, -0.74842857,0.81144444,0.6595,1.48811111,511,11/6/2019 10:41,male,1,2000, -0.85236364,0.94175,0.9477,1.09533333,511,10/22/2019 1:08,male,1,2000, -2.723,2.951,2.1004,2.47925,511,10/22/2019 11:08,male,1,2000, -0.6216,0.71257143,0.63527273,0.67005882,511,11/7/2019 8:31,male,1,2000, -0.716,0.79854545,0.81533333,0.872,511,10/22/2019 1:30,male,1,2000, -0.80945455,0.61875,0.67807692,0.9348,511,11/4/2019 19:35,male,1,2000, -0.65633333,0.73009091,0.755875,0.55064706,511,11/8/2019 17:09,male,1,2000, -0.988,0.960875,0.82488889,1.1088,511,10/22/2019 1:43,male,1,2000, -0.66177778,0.68906667,0.676,0.73963636,511,11/5/2019 10:24,male,1,2000, -0.566,0.86228571,0.59477778,0.64592308,512,10/21/2019 18:44,male,1,2000, -0.71611111,0.797,0.74445455,0.71372727,512,11/6/2019 9:09,male,1,2000, -0.634,0.58315385,0.631,0.63872727,512,11/10/2019 14:29,male,1,2000, -0.99033333,0.8959,0.825,0.69985714,512,10/22/2019 18:44,male,1,2000, -0.61718182,0.52641176,0.728625,0.63583333,512,11/7/2019 22:08,male,1,2000, -0.7224375,0.63883333,0.61475,0.8942,512,11/4/2019 8:07,male,1,2000, -0.76785714,0.6341,0.75336364,0.6366,512,11/8/2019 17:41,male,1,2000, -0.82988889,0.88309091,0.859125,0.84057143,512,10/21/2019 18:32,male,1,2000, -0.62682353,0.58763636,0.65355556,0.71811111,512,11/5/2019 9:35,male,1,2000, -0.73125,0.7058,0.57044444,0.62092308,512,11/9/2019 19:44,male,1,2000, -0.9832,0.75857143,1.06411111,0.868,513,11/7/2019 7:30,female,1,1999, -0.91071429,0.94566667,0.936875,0.9786,513,11/4/2019 7:19,female,1,1999, -0.70763158,0.78325,0.84642857,0.8138,513,11/8/2019 22:15,female,1,1999, -0.98677778,0.91666667,0.99944444,0.92028571,513,11/5/2019 14:31,female,1,1999, -0.75527273,0.7115,0.76863636,0.96483333,513,11/9/2019 21:23,female,1,1999, -0.818625,0.5665,0.666,0.8457,513,11/6/2019 10:03,female,1,1999, -0.75975,0.66721429,0.76875,0.859,513,11/10/2019 13:06,female,1,1999, -0.53861538,0.62209091,0.8371,0.67318182,516,11/8/2019 13:46,male,1,2000, -0.6793125,0.6805,0.71875,0.7858,516,11/5/2019 9:41,male,1,2000, -0.6315,0.5552,0.69791667,0.81090909,516,11/9/2019 22:54,male,1,2000, -0.68,0.67566667,0.863625,0.78475,516,11/6/2019 9:51,male,1,2000, -0.65566667,0.68985714,0.76823077,0.65325,516,11/10/2019 11:43,male,1,2000, -0.6153,0.62872727,0.75192308,0.73644444,516,11/7/2019 19:46,male,1,2000, -0.662,0.5845,0.64923077,0.6627,517,11/6/2019 8:52,male,1,2000, -0.521,0.50328571,0.54972727,0.52747368,517,11/12/2019 9:31,male,1,2000, -0.5958,0.58093333,0.68954545,0.64614286,517,11/7/2019 7:17,male,1,2000, -0.58933333,0.59041667,0.688,0.66113333,517,11/8/2019 8:15,male,1,2000, -0.83533333,0.72814286,0.8345,0.704,517,11/5/2019 7:41,male,1,2000, -0.53707143,0.4935,0.62984615,0.6464,517,11/9/2019 7:18,male,1,2000, -0.57007692,0.4987,0.5595,0.68969231,519,11/7/2019 8:13,male,1,2000, -1.10071429,1.07444444,1.084,0.8622,519,11/4/2019 8:13,male,1,2000, -1.0319,0.72925,0.61107143,0.73657143,519,11/8/2019 7:59,male,1,2000, -0.97442857,0.78008333,0.8394,0.9563,519,11/5/2019 7:52,male,1,2000, -0.74375,0.91575,0.66372727,0.84885714,519,11/9/2019 7:22,male,1,2000, -0.82907692,0.68471429,0.734,1.08085714,519,11/6/2019 8:46,male,1,2000, -0.83716667,0.57052941,0.4916,0.8735,519,11/10/2019 8:07,male,1,2000, -2.118,0.984,1.161,0.83933333,520,11/4/2019 22:13,male,1,2000, -0.93816667,0.724375,0.862,0.856,520,11/8/2019 23:34,male,1,2000, -1.03,0.9408,0.981,0.94846154,520,11/5/2019 7:01,male,1,2000, -0.9668,1.3185,0.84944444,1.01611111,520,11/9/2019 6:10,male,1,2000, -1.06077778,0.767625,1.0355,0.9472,520,11/6/2019 6:55,male,1,2000, -1.01657143,0.91528571,1.13,0.951,520,11/10/2019 11:23,male,1,2000, -1.037,0.815625,0.85642857,0.96633333,520,11/7/2019 6:14,male,1,2000, -0.74666667,0.88614286,0.65461538,0.689,521,11/4/2019 7:32,female,1,2000,2 -0.729125,0.62957143,0.71614286,0.51325,521,11/8/2019 7:13,female,1,2000,2 -0.76,0.58372727,0.63416667,1.13122222,521,11/5/2019 9:48,female,1,2000,2 -0.69791667,0.57441176,0.7585,0.563,521,11/9/2019 7:08,female,1,2000,2 -0.62588889,0.63209091,0.58675,0.5775,521,11/6/2019 9:20,female,1,2000,2 -0.6849,0.68572727,1.0675,0.819,521,11/10/2019 10:52,female,1,2000,2 -1.229125,1.05475,0.900625,0.71525,521,10/16/2019 21:32,female,1,2000,2 -0.5778,0.730875,0.65725,0.52464286,521,11/7/2019 7:24,female,1,2000,2 -0.86616667,1.0216,0.94275,0.94871429,522,11/4/2019 7:46,female,1,2000,2 -0.83725,0.98966667,0.809875,0.6105,522,11/8/2019 7:35,female,1,2000,2 -0.8665,1.007875,0.76028571,1.128125,522,11/5/2019 10:03,female,1,2000,2 -0.79466667,1.24728571,0.94,0.86522222,522,11/9/2019 7:27,female,1,2000,2 -0.801375,1.291625,0.909375,0.96516667,522,11/6/2019 9:41,female,1,2000,2 -0.87533333,0.94971429,0.84073333,0.84616667,522,11/10/2019 16:59,female,1,2000,2 -1.03275,1.31671429,1.2275,0.85642857,522,10/16/2019 21:33,female,1,2000,2 -0.9765,0.9225,0.898,0.9659,522,11/7/2019 7:47,female,1,2000,2 -0.68881818,0.7715,0.92525,0.67511111,524,11/8/2019 8:33,female,1,2000,3 -0.836125,0.68372727,0.74963636,0.83088889,524,11/4/2019 7:51,female,1,2000,3 -0.63314286,0.6933,0.79591667,0.61921429,524,11/9/2019 8:14,female,1,2000,3 -0.5615,0.771,0.73142857,0.66333333,524,11/5/2019 9:41,female,1,2000,3 -0.6774,0.74545455,0.74083333,0.858375,524,11/10/2019 10:06,female,1,2000,3 -0.71511111,0.63633333,0.89325,0.6975,524,11/6/2019 9:33,female,1,2000,3 -1.08266667,1.3916,1.017,1.015,524,10/19/2019 20:24,female,1,2000,3 -0.704,0.63483333,0.73576923,0.67809091,524,11/7/2019 8:34,female,1,2000,3 -1.12677778,0.75642857,0.90871429,1.29083333,526,10/16/2019 20:59,male,1,2000, -2.025,1.2096,1.581,1.568,527,10/16/2019 21:37,male,1,2000,4 -0.60290909,0.45582609,0.6384,0.583875,527,10/17/2019 19:55,male,1,2000,4 -0.6092,0.46391667,0.68525,1.06133333,527,11/5/2019 6:38,male,1,2000,4 -0.61915385,0.53708333,0.54883333,0.72083333,527,11/9/2019 6:13,male,1,2000,4 -1.112,1.66916667,1.241,1.614,527,10/16/2019 21:49,male,1,2000,4 -0.89,0.792,1.03666667,0.60266667,527,10/17/2019 20:53,male,1,2000,4 -0.57746154,0.45258333,0.59322222,1.04272727,527,11/6/2019 6:25,male,1,2000,4 -0.57018182,0.455,0.61433333,0.73161538,527,11/10/2019 10:50,male,1,2000,4 -0.72481818,1.0285,0.73925,0.92575,527,10/16/2019 22:01,male,1,2000,4 -3.531,4.496,3.3435,2.94633333,527,10/18/2019 7:31,male,1,2000,4 -0.581,0.503,0.53542857,0.61931579,527,11/7/2019 7:24,male,1,2000,4 -0.80622222,1.0256,0.77563636,0.81509091,527,10/17/2019 19:54,male,1,2000,4 -0.55828571,0.717875,0.63633333,0.70066667,527,11/4/2019 6:25,male,1,2000,4 -0.56125,0.47822222,0.56344444,0.67542857,527,11/8/2019 7:26,male,1,2000,4 -0.685,0.9642,0.80028571,1.22142857,528,10/21/2019 16:25,male,1,1994, -1.11866667,0.78442857,1.19425,0.85271429,529,10/16/2019 22:04,male,1,1978, -0.628,1.82766667,0.950625,1.978,530,10/16/2019 22:28,female,1,2001, -0.51964286,0.58876923,0.49777778,0.5745,530,11/10/2019 16:13,female,1,2001, -0.4724,0.50605882,0.51227273,0.5344375,530,11/10/2019 16:20,female,1,2001, -0.50359091,0.55375,0.62164286,0.5776,530,11/10/2019 16:05,female,1,2001, -0.505,0.59415385,0.54490909,0.55108333,530,11/10/2019 16:14,female,1,2001, -0.50592308,0.5131,0.5616,0.618,530,11/10/2019 16:06,female,1,2001, -0.49746154,0.5088,0.56766667,0.51558824,530,11/10/2019 16:15,female,1,2001, -0.538125,0.4982,0.55113333,0.5455,530,11/10/2019 16:07,female,1,2001, -0.50483333,0.47313333,0.56273333,0.5308,530,11/10/2019 16:18,female,1,2001, -0.69383333,0.87522222,0.70088889,0.66829412,531,10/16/2019 22:24,male,1,1984, -0.6923,0.75233333,1.37616667,0.89916667,532,10/16/2019 22:36,male,1,1987, -1.6385,1.9525,5.467,1.221,533,10/17/2019 20:27,female,1,1961, -1.4274,1.0275,1.18866667,1.768,534,10/16/2019 22:49,male,1,1968, -2.0755,1.98866667,2.49033333,1.391,535,10/16/2019 23:04,male,1,1956, -4.619,2.513,2.7064,2.1675,538,10/26/2019 18:35,female,1,1966,3 -0.70022222,0.72554545,0.75263636,0.882625,538,11/10/2019 10:37,female,1,1966,3 -1.06125,1.15742857,1.396,1.11571429,538,11/10/2019 10:43,female,1,1966,3 -1.4382,1.93325,1.307,1.34166667,538,10/26/2019 19:00,female,1,1966,3 -0.69445455,0.649,0.8238,0.93414286,538,11/10/2019 10:39,female,1,1966,3 -0.97866667,1.2415,1.14655556,1.16457143,538,11/10/2019 10:44,female,1,1966,3 -1.004,1.20475,1.563,1.33742857,538,10/20/2019 14:29,female,1,1966,3 -2.86933333,2.443,1.96475,2.3355,538,10/26/2019 20:05,female,1,1966,3 -0.93418182,0.81975,0.87188889,0.85483333,538,11/10/2019 10:40,female,1,1966,3 -1.27977778,0.83614286,1.18977778,0.836,538,10/26/2019 18:11,female,1,1966,3 -0.91766667,0.8922,0.8762,1.3265,538,11/10/2019 10:35,female,1,1966,3 -1.20383333,1.18916667,1.085125,2.182,538,11/10/2019 10:41,female,1,1966,3 -0.71913333,0.70785714,0.77033333,0.82545455,539,10/17/2019 16:05,male,0,1996, -0.876,0.748625,0.6647,0.6774,540,11/4/2019 6:45,female,1,2000,2 -0.772625,0.6355,0.61690909,0.54010526,540,11/6/2019 7:38,female,1,2000,2 -0.67771429,0.58461538,0.6732,0.53688889,540,11/10/2019 14:47,female,1,2000,2 -0.718,0.67733333,0.71021429,0.98728571,540,11/5/2019 7:32,female,1,2000,2 -0.7196,0.572625,0.62925,0.59833333,540,11/7/2019 6:39,female,1,2000,2 -0.68958333,0.5144,0.794625,0.65272727,540,11/8/2019 6:19,female,1,2000,2 -0.68981818,1.40633333,1.20233333,0.936,540,10/17/2019 16:15,female,1,2000,2 -0.75988889,0.5585,0.70916667,0.55,540,11/9/2019 15:27,female,1,2000,2 -1.05516667,1.21277778,0.9686,1.12916667,542,10/17/2019 17:15,male,1,1978, -0.8895,1.095,1.0665,1.023,544,10/17/2019 16:25,male,1,1950, -1.079375,1.5295,1.0915,1.22183333,545,10/17/2019 16:54,male,1,1960, -0.6772,0.67585714,0.72877778,0.82071429,547,10/17/2019 17:07,male,1,1984, -1.194,1.11357143,1.4812,1.49214286,549,10/17/2019 19:19,male,1,1988, -1.3835,2.8224,1.76566667,1.121,550,10/17/2019 19:46,male,1,1974, -1.567,2.25475,1.6435,1.5305,550,10/17/2019 19:47,male,1,1974, -0.61163636,0.72814286,0.695,0.5176,551,10/17/2019 19:45,male,0,1985, -1.7908,2.9384,2.029,2.111,552,10/17/2019 20:05,female,1,1977, -0.64772727,0.58914286,0.74072727,0.505,553,10/17/2019 19:59,male,1,1978, -0.6455,0.566375,0.656,0.4721,554,10/17/2019 20:17,female,1,1968, -2.164,1.4235,2.71866667,1.72266667,555,10/17/2019 20:31,male,1,1964, -0.5295,1.03,0.768,0.911,556,10/17/2019 21:10,female,1,1989, -0.746,1.29466667,1.4214,1.3625,556,10/19/2019 12:29,female,1,1989, -0.88966667,0.718,0.8827,0.85046154,557,10/20/2019 20:45,female,1,1977, -1.05911111,0.95816667,0.9792,0.931,562,10/21/2019 22:42,female,1,1987, -2.919,1.123,1.05,1.81925,563,10/19/2019 19:29,male,1,1984, -1.215625,1.65466667,1.241375,0.804,563,10/21/2019 23:15,male,1,1984, -0.82,1.06685714,1.01288889,0.97271429,564,10/21/2019 18:42,female,1,1977, -1.26957143,0.96842857,1.33125,1.5532,564,10/22/2019 13:10,female,1,1977, -0.82,1.06685714,1.01288889,0.97271429,564,10/21/2019 18:42,female,1,1977, -2.6875,2.0695,2.69066667,2.59133333,565,10/21/2019 17:20,male,1,1963, -2.776,2.26375,1.928,3.035,565,10/21/2019 17:35,male,1,1963, -1.51757143,1.7255,1.4982,1.784,566,10/21/2019 16:39,female,1,1956, -0.91842857,0.81115385,0.7872,1.0062,567,10/17/2019 23:15,male,1,1975, -1.3434,1.0592,1.09757143,2.4795,568,10/18/2019 12:22,female,1,1981, -1.0436,0.7249,1.23428571,0.78863636,568,10/19/2019 10:59,female,1,1981, -0.7825,0.7297,0.87866667,0.77546154,569,10/18/2019 12:41,male,1,1980, -0.77657143,1.0175,0.89511111,0.81244444,570,10/18/2019 13:26,female,1,1978, -0.762,0.6095,0.725,0.749,571,10/18/2019 14:09,male,1,1978, -0.9075,0.83133333,1.32,0.916,571,10/19/2019 13:51,male,1,1978, -1.075625,0.92681818,0.964,0.77744444,575,10/18/2019 16:30,male,0,1977, -0.67642857,0.97116667,0.9015,1.04275,580,10/18/2019 18:19,female,1,1981, -2.1156,1.55014286,1.816,1.2534,580,10/18/2019 17:52,female,1,1981, -1.85075,1.4405,1.6426,1.15,580,10/18/2019 17:53,female,1,1981, -1.152125,1.24083333,1.27525,1.1695,580,10/18/2019 17:54,female,1,1981, -3.0595,6.214,2.141,2.19316667,581,10/18/2019 17:55,male,1,1955, -0.64911765,0.6036,0.9555,0.74671429,582,10/19/2019 14:04,male,1,2000, -2.15357143,1.41166667,1.751,2.084,582,10/19/2019 14:19,male,1,2000, -0.68376923,0.63091667,0.809625,0.587,582,10/19/2019 13:21,male,1,2000, -1.9765,2.177,2.0215,2.10475,582,10/19/2019 14:39,male,1,2000, -1.126,1.22716667,1.39633333,1.1722,582,10/19/2019 13:46,male,1,2000, -1.2745,1.322,1.43625,0.79983333,583,10/18/2019 17:59,female,1,1976, -2.3915,2.78,2.64,1.52575,584,10/18/2019 18:17,female,1,1960, -2.319,1.914,1.828,3.0345,585,10/18/2019 18:34,male,1,1960, -0.84571429,1.21354545,0.70355556,0.64116667,587,10/18/2019 18:48,male,1,1982, -0.750375,0.97114286,0.89163636,0.52958333,588,10/18/2019 20:39,male,1,1995, -0.68709091,0.70166667,0.72436364,0.88418182,588,10/18/2019 20:56,male,1,1995, -0.648,0.61,0.612,0.64685714,588,10/18/2019 18:54,male,1,1995, -1.167,6.822,1.2365,1.28875,589,10/18/2019 18:56,male,1,1980, -0.96157143,0.83485714,1.09233333,0.79233333,589,10/18/2019 18:57,male,1,1980, -0.82725,1.1695,1.05588889,0.98655556,591,10/18/2019 19:05,male,1,1947, -1.4844,1.924,1.3795,1.48975,591,10/18/2019 19:06,male,1,1947, -0.724,0.64790909,0.58321429,0.5535,592,10/18/2019 19:00,male,1,1984, -0.82785714,0.69327273,0.76528571,0.5765,593,10/21/2019 20:41,male,1,1989, -1.07625,1.1555,1.48772727,0.8412,594,10/18/2019 19:22,male,1,1958, -0.880375,0.74966667,0.96027273,0.6154,595,10/18/2019 19:17,male,1,1987, -1.061,1.539,0.89742857,1.54,596,10/18/2019 19:40,female,1,1975, -1.5015,1.98966667,1.673625,2.367,597,10/18/2019 20:15,male,1,1966, -0.77516667,0.6875,0.8933,0.69177778,598,10/18/2019 20:56,female,1,1987,2 -1.060125,0.855,0.98733333,0.7739,599,10/19/2019 10:14,male,1,1989, -0.75344444,0.83828571,0.734,0.82254545,600,10/19/2019 14:26,male,0,1985, -3.22033333,5.005,4.095,2.8885,601,10/18/2019 21:29,male,1,1954, -0.62228571,0.6878,0.84957143,0.57286667,602,10/19/2019 14:05,female,1,1985, -1.312,2.143,1.918,1.222,603,10/20/2019 15:03,female,1,1977, -0.932,1.15566667,1.22566667,1.6635,604,10/19/2019 13:54,female,1,1969, -0.86457143,1.2715,0.89983333,1.17144444,605,10/18/2019 21:15,female,1,1964, -1.414,1.0963,1.2706,1.0394,606,10/19/2019 13:33,male,1,1955, -1.09166667,1.33583333,1.39633333,1.367625,608,10/18/2019 22:14,male,1,1979,2 -1.77575,1.49475,1.4535,1.236,608,10/20/2019 18:49,male,1,1979,2 -1.83,1.3728,1.372,1.1052,609,10/18/2019 22:37,female,1,1949,2 -0.9857,1.147,1.1456,0.73444444,610,10/18/2019 22:56,male,1,1970,2 -0.839125,1.01725,0.93011111,0.89328571,611,10/18/2019 23:10,female,1,1962,3 -0.5702,0.6318,0.58021429,0.6774,613,10/19/2019 0:37,male,1,2000, -0.45747059,0.5268,0.58973333,0.54985714,613,10/19/2019 0:38,male,1,2000, -1.618,1.6185,1.454,1.747,614,10/19/2019 2:47,male,1,1954, -1.8588,1.378,1.16466667,1.38466667,615,10/19/2019 10:43,female,1,1989, -0.6644,0.76118182,0.613875,0.67344444,616,10/19/2019 11:08,male,1,1989, -1.359875,1.371,1.7052,1.4514,617,10/19/2019 11:24,female,1,1988, -0.59146667,0.7417,0.60233333,0.567,618,10/19/2019 11:27,male,1,1987, -0.606,0.736,0.7532,0.62446154,620,10/19/2019 11:21,male,1,1989, -2.00225,2.24566667,2.074,1.7744,622,10/19/2019 11:48,female,1,1957, -0.8145,0.807,0.8741,0.8633,623,10/19/2019 11:47,male,1,1978, -0.8624,1.013,1.40777778,1.34,624,10/19/2019 11:50,female,1,1979, -1.027,1.01183333,0.75185714,1.2115,626,10/19/2019 11:58,male,1,1969, -2.14833333,1.8458,2.027,2.20475,627,10/19/2019 12:17,male,1,1964, -2.69075,1.787,2.286,2.50033333,629,10/19/2019 12:54,female,1,1945, -0.7276,0.7875,0.99875,0.8341,630,10/19/2019 12:50,male,1,1987, -1.101625,1.02577778,1.261,1.06257143,631,10/19/2019 13:10,female,0,1987, -0.672,1.031,0.6528,0.81966667,632,10/19/2019 13:22,female,1,1985, -1.4376,0.84885714,0.82608333,0.89371429,632,10/19/2019 13:11,female,1,1985, -0.78711111,0.765,0.90083333,0.82153846,633,10/22/2019 16:11,female,1,1980, -0.749,0.9445,0.757,0.7715,633,11/10/2019 22:12,female,1,1980, -0.89066667,1.03225,0.7474,0.971,633,11/10/2019 22:20,female,1,1980, -1.2342,1.36885714,1.52575,1.497,633,10/21/2019 19:53,female,1,1980, -0.99883333,1.26822222,0.85833333,1.195125,633,10/22/2019 16:28,female,1,1980, -0.775875,1.19585714,1.145,0.59375,633,11/10/2019 22:14,female,1,1980, -0.63841667,1.2276,1.33766667,0.962375,633,11/10/2019 22:21,female,1,1980, -0.84077778,1.0578,0.756,1.0434,633,10/21/2019 21:14,female,1,1980, -1.07433333,1.3965,1.36,1.18928571,633,10/22/2019 16:29,female,1,1980, -0.69271429,1.05,1.01333333,0.844,633,11/10/2019 22:16,female,1,1980, -4.0465,4.301,3.078,3.38975,633,10/21/2019 22:36,female,1,1980, -0.70033333,0.76533333,0.75233333,0.585,633,11/10/2019 22:09,female,1,1980, -0.72457143,1.106125,0.94772727,0.73057143,633,11/10/2019 22:18,female,1,1980, -1.17416667,1.5226,1.13088889,1.15,633,10/20/2019 11:41,female,1,1980, -0.93818182,0.60558333,0.907375,0.7896,633,10/22/2019 15:28,female,1,1980, -3.5935,2.128,1.3275,1.65566667,634,10/19/2019 13:55,male,1,1969, -2.0248,4.672,1.23866667,2.0715,635,10/19/2019 13:58,female,1,1952, -1.4244,1.0974,1.0189,0.985,636,10/19/2019 14:12,female,1,1984, -0.738,0.62093333,0.63076923,0.72925,638,10/19/2019 14:25,male,1,1985, -2.86433333,1.727,1.86866667,1.36242857,639,10/19/2019 14:36,female,0,1960, -1.08675,1.0537,1.19685714,1.091,640,10/19/2019 14:42,female,1,1977, -0.7254,0.61978571,0.62516667,0.785,641,10/19/2019 14:43,male,1,1981, -0.885,0.75728571,1.09422222,1.1806,642,10/19/2019 14:56,female,1,2001, -1.882,2.424,1.146,1.756,643,10/19/2019 14:57,female,1,1953, -1.007,0.7172,1.17725,1.061875,644,10/19/2019 15:07,male,1,1983, -1.7075,1.8684,1.4825,1.5052,645,10/19/2019 15:18,female,1,1973, -0.87571429,1.05871429,0.72275,0.708,648,10/19/2019 15:38,female,1,1980, -0.70375,0.945,0.7231,0.66527273,649,10/19/2019 15:28,female,1,1987, -0.5828125,0.55988889,0.5565,0.57061538,650,10/19/2019 16:49,male,1,1970, -0.789375,1.186,0.76605556,0.88328571,651,10/19/2019 15:41,female,1,1986, -0.7403,0.67292308,0.827125,0.851,653,10/19/2019 15:38,female,1,1989, -0.99325,1.15433333,1.31466667,0.75377778,654,10/19/2019 16:01,male,1,2001, -0.89471429,0.67927273,0.689,0.6144,654,10/19/2019 16:02,male,1,2001, -0.90622222,0.96175,1.21211111,0.834625,654,10/19/2019 15:57,male,1,2001, -0.884,0.80644444,1.2145,0.81711111,654,10/19/2019 15:59,male,1,2001, -1.43266667,0.81883333,0.8295,0.88633333,655,10/19/2019 15:49,female,1,1981, -1.44566667,1.618,1.1135,0.94057143,656,10/20/2019 11:24,male,1,1975, -1.387,1.247,1.4396,1.49733333,657,10/19/2019 16:04,female,1,1961, -1.93966667,1.86,1.5632,1.54175,657,10/19/2019 16:05,female,1,1961, -2.35714286,1.808,2.591,1.9745,657,10/19/2019 16:05,female,1,1961, -0.719,0.81266667,0.76742857,0.79185714,658,10/19/2019 16:04,male,1,1988, -1.76366667,2.2874,2.021,1.14583333,659,10/19/2019 16:09,female,1,1963, -1.04757143,0.78444444,0.76523077,0.62111111,660,10/19/2019 16:19,male,1,1964, -1.35866667,1.07766667,1.080625,1.481,662,10/19/2019 16:33,female,1,1978, -0.69933333,0.53325,0.892,0.948,663,10/19/2019 16:46,male,1,2000, -1.3508,1.663,1.25783333,1.32777778,664,10/19/2019 16:38,female,1,1954, -0.6288,0.6438,0.72454545,0.83114286,665,10/19/2019 16:57,female,1,2000, -1.85728571,1.0616,1.454,1.17583333,669,10/19/2019 16:57,male,1,1986, -1.1966,1.69533333,1.29375,1.33066667,672,10/19/2019 22:42,male,1,1975, -1.664,2.104,2.808,1.61675,672,10/19/2019 22:40,male,1,1975, -3.1415,2.85933333,1.28533333,1.7245,673,10/21/2019 18:55,female,1,2000, -2.62816667,1.754,1.6185,2.626,674,10/19/2019 17:02,male,1,1982, -4.11566667,1.8565,1.60266667,1.49033333,676,10/20/2019 16:16,male,1,1967, -1.573,1.5834,1.46214286,1.3594,677,10/19/2019 19:22,female,1,1985, -1.573,1.5834,1.46214286,1.3594,677,10/19/2019 19:22,female,1,1985, -0.7934,0.73054545,0.61388889,0.821,678,10/19/2019 19:23,female,1,1987,3 -0.65645455,0.50983333,0.76908333,0.5365,678,10/19/2019 19:24,female,1,1987,3 -1.55766667,1.4732,1.28785714,1.25833333,679,10/20/2019 9:30,female,1,1973, -1.858,1.753,1.43366667,1.65816667,680,10/19/2019 19:32,female,1,1972, -1.33811111,1.19811111,1.0955,0.77666667,682,10/19/2019 19:40,female,1,1962, -0.853,1.088,0.833,0.86066667,683,10/19/2019 19:41,female,1,1980, -0.74942857,1.06925,0.889625,0.61871429,684,10/20/2019 14:44,male,1,1983, -3.28466667,3.35433333,3.0115,1.897,685,10/19/2019 19:47,male,1,1965, -1.369625,1.688,1.483,1.621,687,10/19/2019 19:50,male,1,1974, -1.07466667,0.958625,0.847875,1.1546,688,10/19/2019 19:53,male,1,1969, -0.70075,0.919,0.532,1.129,690,10/19/2019 19:55,female,1,1988, -0.70075,0.919,0.532,1.129,690,10/19/2019 19:55,female,1,1988, -1.8124,1.23666667,1.2505,1.26833333,691,10/19/2019 20:01,male,1,1965, -0.72344444,0.57836364,0.53345455,0.74606667,692,10/19/2019 19:56,male,1,1985, -1.3665,1.89,1.367,1.33966667,693,10/19/2019 20:03,female,1,1972, -1.851,2.0025,1.8385,1.4775,694,10/20/2019 17:20,male,1,1965, -1.2932,1.4652,1.47,1.30633333,695,10/19/2019 20:17,male,1,1974, -0.737625,0.741875,0.7175,0.5998,696,10/19/2019 20:15,female,1,1979, -1.57266667,1.07433333,1.51916667,1.549,697,10/19/2019 20:15,female,1,1980, -5.98,1.035,2.987,7.223,698,10/19/2019 20:29,female,1,1946, -1.146,1.11633333,0.48,0.838,699,10/19/2019 20:24,male,1,1988, -0.74022222,0.72275,0.62565,0.9974,700,11/7/2019 23:35,male,0,1986,4 -0.69166667,0.5613,0.65275,0.72145455,700,11/9/2019 22:03,male,0,1986,4 -0.726,0.58975,0.696,0.7506,700,11/7/2019 23:50,male,0,1986,4 -0.55070588,0.54525,0.62541667,0.59472727,700,11/10/2019 11:16,male,0,1986,4 -0.7305,0.53264286,0.709,0.6669375,700,11/8/2019 0:04,male,0,1986,4 -0.573,0.591,0.55438462,0.54958824,700,11/10/2019 11:30,male,0,1986,4 -0.81257143,0.8086,0.96166667,0.923,700,10/19/2019 20:26,male,0,1986,4 -0.6911875,0.553125,0.64514286,0.78966667,700,11/9/2019 21:45,male,0,1986,4 -0.93828571,1.32133333,1.13225,1.195125,702,10/19/2019 20:42,male,1,2000, -0.72614286,0.567,0.65115385,0.8745,702,11/5/2019 20:51,male,1,2000, -1.03054545,0.736,0.6033,0.61342857,702,11/8/2019 19:21,male,1,2000, -1.422,1.28175,1.33414286,1.81516667,702,10/19/2019 21:06,male,1,2000, -0.6655,0.62166667,0.767,0.68666667,702,11/5/2019 20:53,male,1,2000, -0.6972,0.67364706,0.644,0.70433333,702,10/19/2019 21:24,male,1,2000, -0.64207692,0.637625,0.6614,0.743875,702,11/6/2019 19:48,male,1,2000, -0.62435714,0.55881818,0.62822222,0.63878571,702,11/12/2019 14:22,male,1,2000, -4.6,2.12625,2.335,1.48766667,702,10/19/2019 20:30,male,1,2000, -2.2355,2.59,2.3615,2.83366667,702,10/19/2019 21:36,male,1,2000, -0.65781818,0.61285714,0.63033333,0.6912,702,11/7/2019 20:02,male,1,2000, -0.68053846,0.61077778,0.6278,0.65233333,702,11/12/2019 14:23,male,1,2000, -1.255125,0.58964286,0.72633333,0.78455556,703,10/19/2019 20:33,male,1,1974, -1.24725,1.29,1.31875,1.258,704,10/20/2019 12:38,female,1,1971, -1.1889,0.76414286,1.019,1.22314286,704,10/20/2019 12:39,female,1,1971, -0.85109091,1.02633333,1.18283333,1.7785,705,10/19/2019 21:20,male,1,1979, -0.8308,1.488,0.7185,0.7746,705,10/19/2019 21:30,male,1,1979, -1.963,1.1618,4.333,1.38666667,705,10/19/2019 21:16,male,1,1979, -1.3745,1.1355,0.72536364,1.0076,706,10/19/2019 20:37,male,1,1986, -3.865,2.424,2.528,2.741,707,10/19/2019 20:48,female,1,1958, -1.72683333,1.12266667,2.5178,1.17,708,10/19/2019 20:46,female,1,1973, -0.91057143,0.572,1.252,1.35028571,709,10/19/2019 20:49,male,1,1961, -0.8575,0.9851,1.1326,0.8413,709,10/19/2019 20:50,male,1,1961, -1.864,1.412,2.25233333,1.634,710,10/19/2019 20:52,male,1,1962, -1.231,1.86233333,2.417,1.348,711,10/19/2019 21:01,female,1,1981, -1.11116667,0.642,1.037,0.8951,712,10/19/2019 21:12,male,1,1981, -1.62383333,1.49457143,2.00466667,2.257,713,10/19/2019 21:06,female,1,1951, -1.5248,1.571,2.194,2.27766667,715,10/19/2019 22:01,female,1,1966, -1.43771429,1.44566667,1.41,1.9115,715,10/19/2019 22:02,female,1,1966, -1.08675,1.20066667,1.82083333,1.15971429,715,10/19/2019 21:38,female,1,1966, -1.036,1.107,0.78771429,1.0325,716,10/19/2019 21:34,male,1,1970, -0.77581818,0.86542857,0.7272,0.7656,718,10/19/2019 21:55,male,1,1987, -2.247,2.4115,2.931,2.1515,719,10/19/2019 22:13,female,1,1945, -2.12875,3.3,3.2175,1.764,719,10/21/2019 16:11,female,1,1945, -1.80916667,1.9995,2.0536,2.0235,720,10/19/2019 22:07,female,1,1967, -1.08714286,0.75166667,0.8095,0.9608,721,10/22/2019 17:58,male,1,1999, -1.3612,0.608,0.6436,0.6153125,721,11/11/2019 3:43,male,1,1999, -0.66472727,0.60236364,0.71111111,0.9042,721,10/22/2019 17:52,male,1,1999, -1.00242857,1.28225,1.16816667,1.18588889,721,10/22/2019 17:59,male,1,1999, -0.68827273,0.57255556,0.77155556,0.624375,721,11/11/2019 3:44,male,1,1999, -0.8412,0.793875,0.927,0.69,721,10/22/2019 17:53,male,1,1999, -1.49066667,1.7065,1.4255,1.833,721,10/22/2019 18:00,male,1,1999, -0.65018182,0.82355556,0.74425,0.80927273,721,11/11/2019 3:45,male,1,1999, -0.94975,1.06766667,0.86957143,0.8603,721,10/22/2019 17:54,male,1,1999, -0.6775,0.84477778,0.70690909,0.7637,721,11/11/2019 3:42,male,1,1999, -0.82928571,1.04085714,0.93475,1.00833333,721,10/22/2019 17:51,male,1,1999, -1.906,1.8926,1.46433333,1.58433333,721,10/22/2019 17:55,male,1,1999, -1.95466667,1.759,2.2272,1.796,724,10/20/2019 15:04,male,1,1950, -0.73063636,0.61090909,0.75488889,0.68908333,726,10/19/2019 23:18,male,1,1989, -0.892625,0.79714286,0.8794,1.05675,728,10/20/2019 0:11,male,1,1978, -1.41733333,1.69814286,1.3356,1.90666667,729,10/20/2019 0:43,female,1,1968, -0.8526,0.89663636,0.91475,0.84727273,730,10/20/2019 13:05,male,1,1985, -0.7277,0.83025,0.91957143,0.71,730,10/20/2019 0:38,male,1,1985, -1.33366667,1.763,1.684,1.748,732,10/20/2019 10:10,female,1,1977, -2.44666667,1.338,2.988,2.72116667,734,10/21/2019 16:03,male,1,1973, -1.3195,1.9995,1.4815,1.72233333,735,10/21/2019 16:28,male,1,1980, -0.7535,0.6858,0.69763636,0.78058333,736,10/20/2019 11:41,female,1,1985, -1.4752,1.3194,0.97863636,0.72371429,737,10/20/2019 11:09,male,1,1959, -1.00857143,0.90922222,1.09414286,1.1758,739,10/20/2019 13:44,female,1,1989, -1.32,1.613375,1.9325,1.327,740,10/20/2019 11:18,female,1,1960, -1.4954,1.59933333,1.32466667,1.48175,741,10/20/2019 11:26,male,0,1972, -1.175,1.23125,1.2485,1.032,742,10/20/2019 11:28,male,1,1979, -1.6366,2.40125,1.485,1.4206,744,10/20/2019 11:40,female,1,1976, -1.18814286,0.917,0.997,0.954,745,10/20/2019 11:38,male,1,1977, -0.82423077,0.72046154,0.856,1.426,746,10/20/2019 11:55,female,1,1983, -1.117125,0.9784,1.1575,0.834,747,10/20/2019 11:49,female,1,1989, -0.7027,0.97288889,0.67141667,0.731,749,10/20/2019 15:46,female,1,2001, -0.59275,0.94183333,0.60607143,0.5805,749,10/20/2019 16:06,female,1,2001, -1.0042,1.29075,1.020625,1.2196,750,10/20/2019 12:22,female,1,1989, -1.17722222,1.465,1.4088,1.413,751,10/20/2019 12:41,male,1,1956, -0.96116667,1.2368,1.1422,0.96366667,752,10/20/2019 12:27,female,1,1987, -1.16383333,1.3955,1.492,1.263,753,10/20/2019 12:25,male,1,1984, -0.8202,0.768375,0.97757143,0.786,754,10/20/2019 12:29,male,1,1969, -0.797375,0.87325,0.9743,0.6471,755,11/10/2019 23:56,female,0,2000, -1.50366667,1.106,0.91814286,1.29133333,755,11/11/2019 1:46,female,0,2000, -0.86355556,0.9355,1.111,1.17714286,755,11/4/2019 9:53,female,0,2000, -0.66244444,0.77116667,0.7008,0.7658,755,11/11/2019 0:52,female,0,2000, -0.65642857,0.9908,0.7262,0.5159375,755,11/5/2019 11:22,female,0,2000, -0.9115,1.22,0.89914286,0.97025,755,11/11/2019 1:13,female,0,2000, -1.0315,0.666,1.02,0.66185714,755,11/10/2019 23:44,female,0,2000, -0.77611111,0.74763636,0.71666667,0.7335,755,11/11/2019 1:25,female,0,2000, -0.75557143,0.66922222,1.13533333,0.86214286,756,10/20/2019 12:40,female,1,1987, -2.053,1.3518,1.608,1.7944,757,10/20/2019 12:44,male,1,1957, -2.229,2.438,2.412,1.81766667,758,10/20/2019 12:48,female,1,1975, -1.17428571,1.151,1.19055556,1.0765,759,10/20/2019 13:00,female,1,1977, -0.708,0.8862,0.903,0.61007143,760,10/20/2019 12:47,female,1,1990, -2.33633333,1.79166667,1.42,1.343,761,10/20/2019 12:54,female,1,1974, -1.41322222,0.67792308,0.696,0.7905,762,10/20/2019 12:50,female,1,1989, -1.6164,1.2995,1.452,1.34071429,763,10/20/2019 12:59,female,1,1985, -0.57891667,0.60146154,0.57407143,0.59675,765,10/20/2019 13:01,male,1,1984, -0.5475,0.60925,0.54866667,0.701,766,10/20/2019 13:11,male,1,1976, -1.3915,1.202,1.637,2.60775,767,10/20/2019 13:13,female,1,1985, -1.25555556,1.2376,0.9175,1.1108,768,10/20/2019 13:21,male,1,1979, -0.80171429,0.625,0.8789,0.63154545,769,10/20/2019 13:24,female,1,1983, -1.55325,0.77485714,1.418,1.19766667,770,10/20/2019 13:24,female,1,2000, -1.469875,1.1484,1.56,1.44975,771,10/20/2019 13:32,male,1,1937, -0.9592,1.2126,1.0685,0.957,773,10/20/2019 18:53,female,1,1987, -1.26988889,0.8708,1.48333333,1.37828571,774,10/20/2019 13:41,female,1,1986, -2.524,2.742,2.038,2.137,776,10/20/2019 13:47,female,1,1957, -3.55,3.9105,2.65,3.0445,777,10/20/2019 13:48,male,1,1956, -0.736125,0.65954545,0.89772727,0.70155556,778,10/20/2019 13:59,female,1,1979, -1.14783333,1.18457143,1.713,1.38425,779,10/20/2019 14:01,female,1,1988, -0.8585,0.787,0.91663636,0.8284,780,10/20/2019 14:05,female,1,1969, -0.9675,0.92575,1.00814286,0.94281818,781,10/20/2019 14:15,female,1,1948, -0.9204,1.20475,1.2105,0.995375,782,10/20/2019 14:14,male,1,1988, -1.50014286,1.54333333,1.4682,1.0925,783,10/20/2019 14:15,male,1,1961, -0.66585714,1.20871429,0.78608333,0.74255556,785,10/20/2019 14:28,male,1,1976, -0.66335714,0.87375,0.85984615,0.64877778,786,10/20/2019 14:36,female,1,1999, -0.56646667,0.648,0.93818182,0.7025,787,10/20/2019 14:41,male,1,1988, -0.90942857,0.90688889,1.0718,1.242625,788,10/20/2019 14:42,female,1,1980, -0.87,0.829375,1.237,0.9775,789,10/20/2019 14:48,male,1,1986, -1.2135,1.064,1.1915,1.3,790,10/20/2019 14:49,male,1,1973, -1.02525,0.966125,0.8985,0.8452,791,10/20/2019 14:56,female,1,1980, -0.64366667,0.57157143,0.72614286,0.7325,793,10/20/2019 15:02,male,1,1967, -1.158,1.1995,1.35125,1.59528571,795,10/20/2019 15:10,male,1,1963, -1.78475,1.09366667,1.8282,1.28,797,10/20/2019 15:22,male,1,1980, -0.97327273,1.089,0.99,1.0855,798,10/20/2019 15:16,female,1,1954, -1.06811111,1.1266,1.21,1.494,799,10/20/2019 15:20,male,1,1988, -1.17333333,1.203,0.928,0.9146,801,10/20/2019 15:31,female,1,1984, -0.6288,0.62842857,0.99377778,0.91166667,802,10/20/2019 15:26,male,1,1985, -0.753,0.77144444,0.8242,0.99266667,803,10/20/2019 15:33,female,1,1989, -0.5222,0.6496,0.61855556,0.65242857,804,11/5/2019 7:54,male,1,2000,4 -0.5825,0.50035,0.61909091,0.5324,804,11/9/2019 7:48,male,1,2000,4 -0.642,0.75,0.50766667,0.581125,804,11/6/2019 7:57,male,1,2000,4 -0.55688889,0.6139,0.63088889,0.55004348,804,11/10/2019 10:05,male,1,2000,4 -0.62141667,0.60690909,0.642375,0.60794118,804,10/20/2019 15:54,male,1,2000,4 -0.6747,0.66555556,0.56191667,0.55633333,804,11/7/2019 8:00,male,1,2000,4 -0.677,0.57783333,0.6432,0.776,804,12/16/2019 17:44,male,1,2000,4 -0.53706667,0.6355,0.91966667,0.50489474,804,11/4/2019 9:24,male,1,2000,4 -0.61430769,0.57435714,0.63883333,0.5615,804,11/8/2019 8:02,male,1,2000,4 -2.724,1.74025,1.60766667,3.01225,805,10/20/2019 15:41,male,0,1952, -0.57155556,0.91233333,1.0829,0.94144444,806,10/20/2019 15:46,male,1,1972, -1.893,1.64575,1.3545,2.01,807,10/20/2019 15:53,male,1,1960, -2.18266667,2.70866667,2.557,3.29566667,809,10/20/2019 15:59,male,1,1949, -1.4384,1.1408,1.2058,1.0527,811,10/20/2019 16:00,female,1,1979, -1.01666667,1.030125,0.875,1.01566667,812,10/20/2019 16:01,female,1,1986, -0.5532,0.6040625,0.56372727,0.59164286,814,10/20/2019 16:11,male,1,1984, -1.36,1.6635,1.4034,1.43375,815,10/20/2019 16:15,female,1,1966, -0.63276923,0.5862,1.14633333,0.7005,817,10/20/2019 16:26,male,1,1974, -0.783,0.72809091,1.1386,0.7905,818,10/20/2019 16:43,male,1,1989, -1.3732,1.30866667,1.41142857,1.56133333,819,10/20/2019 16:32,male,1,1954, -0.829125,1.093,0.65946154,0.754,820,10/22/2019 20:29,female,1,1971, -0.7918,1.039,1.011,0.65783333,820,10/22/2019 19:50,female,1,1971, -1.032,0.916,1.454,1.097,820,10/22/2019 19:53,female,1,1971, -1.2285,1.26185714,1.60366667,1.36183333,821,10/20/2019 16:37,male,1,1951, -0.652,0.81225,0.57025,0.71114286,823,10/20/2019 16:37,male,1,1981, -1.70875,1.6195,1.23571429,1.41,824,10/20/2019 16:43,female,1,1981, -1.413,1.2945,1.65666667,1.12691667,825,10/20/2019 16:40,male,1,1952, -1.319,1.356,1.839,1.651,826,10/20/2019 16:45,female,1,1977, -1.39433333,1.294,1.25,1.2322,826,10/20/2019 16:47,female,1,1977, -4.70866667,2.2635,2.9715,3.896,827,10/20/2019 16:47,male,1,1949, -0.82166667,0.80635714,0.84442857,0.7823,828,10/20/2019 17:14,female,1,1982, -0.688,0.89371429,1.12190909,2.22133333,828,10/22/2019 21:04,female,1,1982, -0.76866667,0.75858333,0.79536364,0.6885,828,10/22/2019 21:19,female,1,1982, -0.52711111,0.63191667,0.561625,0.589,829,10/20/2019 16:46,male,1,2002, -0.7047,0.744,0.62188889,0.65825,830,10/20/2019 16:52,male,1,1973, -1.88233333,2.3335,1.215,1.85771429,831,10/20/2019 16:56,male,1,1954, -0.882,0.83858333,1.34,1.092875,832,10/20/2019 16:57,male,1,1976, -0.882,0.83858333,1.34,1.092875,832,10/20/2019 16:57,male,1,1976, -0.751,0.80372727,0.70376923,1.97833333,833,10/20/2019 16:57,male,1,1987, -0.86833333,0.7841,0.70722222,0.75,835,10/20/2019 17:12,female,1,1984, -0.76766667,0.72111111,0.795,0.78354545,836,10/20/2019 17:13,male,1,1988, -1.18614286,1.48525,1.45,1.95475,837,10/20/2019 17:26,female,1,1967, -0.750375,1.0852,0.8287,0.8806,840,10/20/2019 17:23,female,1,1988, -1.28355556,1.671,1.0978,1.26075,841,10/20/2019 17:27,male,1,1974, -2.8425,1.874,2.104,1.79785714,842,10/21/2019 18:49,male,1,1941, -0.8305,1.1286,0.82242857,0.86233333,843,10/20/2019 17:44,male,1,1975, -1.5445,1.185,1.731,1.67833333,843,10/20/2019 17:43,male,1,1975, -1.514875,1.37983333,1.46033333,1.56066667,845,10/20/2019 17:48,female,1,1964, -0.7924,0.8136,0.65445455,0.79425,846,10/20/2019 18:10,male,1,1983, -1.68633333,1.40216667,1.4865,1.2098,848,10/20/2019 17:51,female,1,1980, -4.71466667,1.04316667,1.1928,1.419,849,10/20/2019 17:56,male,1,1971, -0.75588889,0.77166667,0.6625,0.64115385,850,10/20/2019 17:54,male,1,1986, -1.0155,0.8014,0.9675,1.4906,851,10/20/2019 18:29,female,1,1988, -0.9232,1.059625,0.89727273,0.93783333,852,10/20/2019 18:04,male,1,1959, -1.93375,2.62233333,2.999,1.9355,853,10/20/2019 18:13,male,1,1957, -0.80914286,0.9516,0.91071429,0.73690909,854,10/20/2019 18:13,female,1,1977, -0.5645,0.53258333,0.49278947,0.6115,855,10/20/2019 18:36,male,1,1974, -0.57153846,0.90933333,0.8671,0.72827273,857,10/20/2019 18:32,male,1,1988, -0.72817647,0.70866667,0.85085714,0.96133333,857,10/20/2019 18:58,male,1,1988, -0.7745,0.678,0.82133333,0.7855,857,10/20/2019 19:06,male,1,1988, -1.08316667,1.129,1.282,1.276625,857,10/20/2019 18:31,male,1,1988, -1.4795,1.805,1.69,1.73833333,858,10/20/2019 18:30,male,1,1948, -2.5615,2.262,2.721,2.34,859,10/20/2019 18:32,male,1,1955, -1.61033333,1.832,1.8244,1.627,860,10/20/2019 18:34,male,1,1965, -0.50988235,0.566,0.68333333,0.60866667,861,10/20/2019 18:57,male,1,2000, -0.985625,0.9398,1.157125,1.567,863,10/20/2019 21:29,female,1,1976, -2.776,2.424,2.5376,2.376,864,10/20/2019 18:52,female,1,1976, -1.2385,1.6175,1.81825,1.20075,865,10/20/2019 18:51,female,0,1973, -0.81933333,1.22566667,1.0215,2.175,868,10/20/2019 18:54,female,0,1996, -1.0216,1.40222222,1.116,0.853,870,10/20/2019 19:01,female,1,1980, -1.70283333,1.34757143,1.35766667,1.48225,871,10/20/2019 19:07,female,1,1981, -1.323,1.589,1.17777778,0.94766667,871,10/20/2019 20:14,female,1,1981, -1.791,1.7656,1.26171429,1.13033333,872,10/20/2019 19:12,female,1,1967, -1.20866667,1.32585714,2.29975,1.4764,873,10/20/2019 19:14,male,1,1966, -0.964,1.01128571,0.90275,1.1057,874,10/20/2019 19:14,female,1,1978, -1.9675,1.8092,1.65725,1.53,876,10/20/2019 19:18,male,1,1964, -2.9272,1.08733333,1.5312,2.235,878,10/20/2019 19:32,female,1,1976, -1.00577778,1.35375,2.58066667,1.2116,880,10/20/2019 19:32,male,1,1980, -2.137,1.63533333,1.1948,0.91266667,881,10/20/2019 19:37,female,1,1966, -1.076,1.18733333,1.57333333,1.549,882,10/20/2019 19:40,male,1,1939, -0.81371429,0.7637,0.79433333,0.74944444,883,10/29/2019 18:21,male,1,1967, -1.21433333,1.348,1.309,1.528,884,10/29/2019 18:33,female,1,1950, -2.53633333,2.02428571,2.884,1.256,885,10/20/2019 19:55,female,1,1967, -1.475,1.0574,1.51,1.75366667,887,10/20/2019 20:01,female,1,1977, -0.77488889,0.59083333,1.32125,0.826,888,10/20/2019 20:05,female,1,1989, -0.81569231,0.95228571,1.126,0.9735,889,10/20/2019 20:10,female,1,1978, -1.02783333,1.1945,1.0504,0.68171429,890,10/20/2019 20:24,female,1,1976, -1.484,1.2728,1.01016667,1.27133333,893,10/20/2019 20:43,male,1,1985, -0.797,1.06842857,1.02422222,0.89433333,893,10/20/2019 20:44,male,1,1985, -1.09775,0.870375,0.82672727,1.0148,894,10/20/2019 21:08,male,1,1997, -0.63885714,0.92333333,0.61671429,0.76345455,895,10/20/2019 21:00,male,1,1988, -1.1815,2.2795,1.0364,1.2658,896,10/20/2019 20:51,male,1,1992, -1.01291667,1.7285,1.237,1.46625,897,10/20/2019 21:08,female,1,1980, -1.69975,1.40633333,1.42466667,1.0924,899,10/20/2019 21:27,male,1,1967, -1.3205,1.49766667,1.8816,3.601,900,10/20/2019 21:29,male,1,1977, -0.69533333,0.84871429,0.7718,0.8515,902,10/20/2019 21:33,female,1,1980, -0.80325,0.7013,0.721125,0.78415385,902,10/20/2019 21:34,female,1,1980, -0.68855556,0.52386957,0.648,0.76075,903,10/20/2019 21:29,male,1,1974, -2.59533333,2.10166667,1.66066667,2.032,905,10/20/2019 21:36,male,1,1954, -1.264,1.401,1.7095,1.451125,905,10/20/2019 21:37,male,1,1954, -1.12483333,0.959625,1.216625,1.15425,906,10/21/2019 19:19,male,1,1963, -1.13428571,1.4285,1.41833333,1.12844444,907,10/20/2019 21:43,male,1,1969, -1.15085714,1.03366667,0.88727273,0.89711111,908,10/20/2019 21:49,male,1,1985, -0.77755556,0.622625,0.80792308,0.937125,909,10/20/2019 21:54,male,1,1985, -2.4315,2.70633333,1.5595,1.91525,910,10/20/2019 22:04,female,1,1946, -0.746875,0.659125,0.803,1.29788889,911,10/20/2019 22:09,male,1,1980, -1.141,1.13066667,1.25166667,1.42185714,912,10/20/2019 22:06,female,1,1970, -1.629,1.4638,1.23714286,1.768,913,10/20/2019 22:11,male,1,1980, -0.82623077,0.8725,0.936,1.05,914,10/20/2019 22:23,male,1,1964, -1.0935,1.51333333,1.149,1.25,914,10/20/2019 22:19,male,1,1964, -0.928375,0.94185714,1.0745,0.876,914,10/20/2019 22:22,male,1,1964, -1.13157143,0.923,1.31825,0.969,915,10/20/2019 22:15,female,1,1985, -0.7205,0.973,0.891,0.90883333,916,10/20/2019 22:18,male,1,1974, -0.887,0.671,0.652,0.80166667,917,10/21/2019 23:34,male,1,1982, -0.5164,0.55816667,0.8279,0.7097,918,10/20/2019 22:25,male,1,1984, -0.987625,0.99783333,0.84630769,0.9138,920,10/20/2019 22:30,male,1,1971, -0.8818,1.2898,0.9075,0.96181818,921,10/20/2019 22:45,male,1,1968, -1.45966667,1.36866667,1.39825,1.377625,922,10/20/2019 23:07,male,1,1965, -1.07866667,1.32666667,1.17142857,1.317875,923,10/20/2019 23:07,male,1,1957, -1.85,2.014,1.58366667,1.8125,924,10/20/2019 23:15,female,1,1957, -3.0915,2.9985,1.949,1.949,924,10/20/2019 23:12,female,1,1957, -1.44166667,1.5385,1.6235,1.76571429,924,10/20/2019 23:16,female,1,1957, -2.107,2.562,3.842,2.398,924,10/20/2019 23:13,female,1,1957, -2.9635,2.3375,2.914,2.5445,924,10/20/2019 23:17,female,1,1957, -1.4712,1.30225,1.27525,1.74433333,924,10/20/2019 23:14,female,1,1957, -1.9975,2.1015,1.60871429,2.911,924,10/20/2019 23:18,female,1,1957, -1.3295,1.31411111,1.57475,1.2376,925,10/20/2019 23:23,female,1,1950, -2.26366667,2.159,1.3365,1.107,926,10/20/2019 23:38,female,1,1980, -1.22625,0.91766667,0.93016667,0.748,927,10/20/2019 23:46,female,1,1999, -0.84077778,0.827,0.82044444,0.936,928,10/20/2019 23:50,male,1,1985, -0.71828571,0.838375,0.5715,0.6651875,929,10/20/2019 23:54,male,1,1983, -0.59811111,0.71744444,0.6195,0.89857143,930,10/21/2019 0:20,male,0,1986, -0.682,1.009875,0.8184,0.31328571,931,10/21/2019 1:21,male,1,1985, -0.87416667,0.6279,0.78545455,0.91742857,932,10/21/2019 1:37,male,1,1980, -1.333,1.3388,1.5335,0.99283333,933,10/21/2019 18:28,male,1,1987, -0.26227273,1.14616667,0.9421,0.6017,934,10/21/2019 1:50,female,1,1973, -1.499,1.46657143,1.93425,1.466,935,10/21/2019 6:22,female,1,1979, -0.95366667,1.00366667,0.812,0.978,936,10/21/2019 9:22,male,1,1984, -0.684875,0.676875,0.6718125,0.61561538,937,11/10/2019 10:50,male,1,2000, -0.73133333,0.84633333,0.6462,0.7284,937,11/7/2019 8:01,male,1,2000, -0.76166667,0.75977778,0.71218182,0.69608333,937,11/10/2019 10:04,male,1,2000, -0.6522,0.77666667,0.6208,0.8924,937,11/8/2019 10:05,male,1,2000, -0.6225,0.76066667,0.611,0.7534,937,11/10/2019 10:42,male,1,2000, -0.56322222,0.8995,0.73566667,0.8134,937,11/10/2019 7:29,male,1,2000, -0.57325,0.68957143,0.59230769,0.6215,937,11/10/2019 10:44,male,1,2000, -0.58714286,0.67188235,0.766125,0.8054,937,11/10/2019 9:11,male,1,2000, -0.65427273,0.58316667,0.56376923,0.595125,937,11/10/2019 10:48,male,1,2000, -0.992875,1.4604,1.1374,0.94866667,938,11/10/2019 19:47,male,1,2000, -1.82025,1.2915,1.5605,1.691875,938,11/10/2019 19:36,male,1,2000, -0.75725,0.8572,0.9848,0.86355556,938,11/10/2019 19:49,male,1,2000, -1.3265,1.069375,1.38557143,1.11466667,938,11/10/2019 19:39,male,1,2000, -0.82,0.67166667,0.7775,0.69415385,938,11/10/2019 19:51,male,1,2000, -0.92772727,0.9072,1.01175,1.0884,938,11/10/2019 19:45,male,1,2000, -0.70283333,0.60316667,0.6664,0.7597,938,11/10/2019 19:53,male,1,2000, -0.61083333,0.95842857,0.6671,0.75581818,939,10/23/2019 0:21,male,1,2000, -0.751,0.976,0.744,0.634,940,11/3/2019 12:37,male,1,2000, -0.975,0.963,1.063,1.0272,940,11/3/2019 13:14,male,1,2000, -1.22783333,1.5095,1.214,1.2622,943,10/23/2019 21:31,female,1,2000, -0.87525,0.94133333,0.9629,0.924125,947,10/21/2019 10:41,male,1,1964, -3.198,1.514,1.03933333,1.0485,952,10/21/2019 10:52,female,1,1971, -1.78933333,0.6152,0.922,0.95475,952,10/21/2019 10:53,female,1,1971, -1.42116667,1.298,1.17346154,1.43433333,956,10/21/2019 11:23,male,1,1963, -2.21575,1.425,4.991,2.08033333,957,10/21/2019 11:43,male,1,1949, -3.38575,1.4485,1.716,2.992,958,10/21/2019 12:26,female,0,1980, -1.6922,1.29716667,1.264,2.05816667,959,10/21/2019 13:31,male,1,1977, -0.3972,0.45644444,0.47573333,0.50576923,966,11/10/2019 22:26,male,1,1999, -0.3985,0.41475,0.517,0.4272,966,11/10/2019 22:33,male,1,1999, -0.45633333,0.49865,0.504,0.43511111,966,11/10/2019 22:27,male,1,1999, -0.428125,0.46333333,0.40166667,0.43306667,966,11/10/2019 22:35,male,1,1999, -0.42708333,0.51775,0.41935714,0.4621,966,11/10/2019 22:30,male,1,1999, -0.47714286,0.56153333,0.49653333,0.54138462,966,11/10/2019 22:24,male,1,1999, -0.42986667,0.49617647,0.4492,0.418,966,11/10/2019 22:31,male,1,1999, -0.88872727,0.574375,0.897625,0.91466667,969,10/21/2019 14:09,male,1,1975, -2.4282,1.859,1.958,1.9632,970,10/21/2019 14:14,male,1,1948, -0.61392857,0.756,0.62107692,0.783375,971,10/21/2019 14:19,male,1,1988, -1.3666,1.25177778,1.52925,1.1516,972,10/21/2019 14:49,male,1,1969, -0.698625,1.0846,0.9025,1.02422222,973,10/21/2019 14:36,male,1,1986, -1.89333333,1.64266667,2.294,2.17625,974,10/21/2019 14:49,male,1,1977, -1.23642857,1.821,1.46525,2.0018,975,10/21/2019 15:02,male,1,1963, -1.51471429,1.06016667,1.7525,0.81009091,976,10/21/2019 15:26,male,1,1988, -1.35725,1.59166667,1.758,1.51333333,977,10/21/2019 15:20,female,1,1957, -1.155375,2.2215,1.622,1.4474,978,10/21/2019 15:24,female,1,1984, -2.03,2.128,2.2375,1.13675,979,10/21/2019 15:26,male,1,1969, -0.94022222,1.374,1.02475,1.12225,980,10/21/2019 15:26,female,1,1973, -0.94771429,0.961,0.93288889,0.85866667,981,10/21/2019 15:33,male,1,1986, -0.7944,0.95011111,0.74671429,0.65791667,982,10/21/2019 15:41,male,1,1965, -0.7582,0.94318182,0.9603,0.768625,983,10/21/2019 15:54,female,1,1954, -1.9924,1.67185714,1.226,1.903,984,10/21/2019 15:56,male,1,1981, -0.9288,1.08266667,0.8665,0.72491667,986,10/21/2019 16:02,male,1,1988, -0.827,1.5988,1.358,1.596,987,10/21/2019 16:05,male,1,1960, -0.56691667,0.75275,0.62269231,0.7125,988,10/21/2019 16:07,male,1,1994, -0.72128571,0.79888889,0.6705,0.47241176,989,10/21/2019 16:14,male,1,1986, -1.05633333,1.997,1.70985714,1.5265,990,10/21/2019 16:15,male,1,1965, -2.896,2.3546,2.931,2.61466667,991,10/21/2019 16:18,male,1,1950, -1.89183333,1.825,2.273,1.9565,992,10/21/2019 16:29,female,1,1968, -1.8075,1.604,1.56066667,1.66766667,993,10/21/2019 17:32,female,0,1980, -1.2816,1.496,1.3802,1.0638,993,10/22/2019 16:53,female,0,1980, -0.86366667,1.534,1.82733333,1.02866667,994,10/21/2019 16:49,female,0,1978, -1.22166667,0.52354545,0.95228571,0.812125,996,10/21/2019 16:22,male,1,1983, -0.49954545,0.55307692,0.583,0.49047059,997,10/21/2019 16:34,male,1,1997, -0.74478571,0.709,0.7887,0.9955,998,10/21/2019 16:30,female,1,1984, -0.65628571,2.262,0.997,0.983,999,10/21/2019 16:36,male,1,2000, -0.73933333,1.231,0.81675,1.1218,1002,10/21/2019 16:55,male,1,2000, -0.7736,1.006125,0.8783,0.9566,1003,10/21/2019 16:44,male,1,1975, -2.5935,3.074,4.381,2.14166667,1004,10/21/2019 16:46,female,1,1966, -1.54275,1.5602,1.53975,1.49816667,1005,10/21/2019 16:52,male,1,1954, -0.69233333,0.51117647,0.62716667,0.66425,1006,10/21/2019 16:52,male,0,1988, -0.59326667,0.45321429,0.848,0.549,1009,10/21/2019 16:56,female,1,1995, -1.02,0.935,1.3455,0.999,1011,10/21/2019 17:53,female,1,1971, -1.3502,1.62916667,1.0036,1.01914286,1013,10/21/2019 17:12,female,1,1980, -1.4866,1.13,0.9365,0.9926,1013,10/21/2019 17:13,female,1,1980, -1.148,2.193,4.398,1.33566667,1014,10/21/2019 17:19,male,1,1980, -0.77175,0.6243,0.69722222,0.79938462,1016,10/21/2019 17:33,male,1,1983, -0.80723077,0.669,0.86857143,0.82225,1017,10/21/2019 17:16,male,1,1973, -1.546,1.33614286,0.996,1.4495,1018,10/21/2019 17:21,female,1,1980, -1.20133333,0.98644444,1.07977778,1.21983333,1019,10/21/2019 17:25,male,1,1974, -0.62491667,0.615,0.70977778,0.957875,1020,10/21/2019 17:47,male,1,1981, -5.353,3.456,2.9255,6.874,1021,10/21/2019 17:36,female,1,1960, -1.024,1.163625,2.29633333,1.453,1022,10/21/2019 17:34,male,1,1985, -1.26366667,1.33655556,0.95633333,1.28783333,1023,10/21/2019 17:36,female,1,1985, -0.6534,0.88769231,0.5755,0.71154545,1025,10/21/2019 17:39,male,1,1988, -1.40475,1.39166667,1.64,1.448,1028,10/21/2019 17:51,male,1,1961, -0.86833333,0.97375,1.382,0.94525,1029,10/22/2019 16:24,female,1,1983, -1.0373,1.0715,1.28933333,1.25522222,1030,10/22/2019 17:16,male,1,1972, -1.26957143,1.44766667,1.9338,1.205,1031,10/22/2019 17:38,male,1,1966, -1.217,1.48466667,1.29,0.8535,1031,10/22/2019 17:37,male,1,1966, -3.03975,4.652,5.486,5.919,1032,10/21/2019 17:57,male,1,1968, -1.76633333,1.7845,1.61966667,1.84016667,1033,10/22/2019 18:21,male,1,1953, -3.20633333,1.522,1.6775,1.586,1035,10/21/2019 18:01,male,1,1956, -3.56433333,1.10016667,1.6302,1.06733333,1036,10/21/2019 17:59,female,1,1974, -1.18355556,1.50633333,1.2098,1.54366667,1038,10/21/2019 18:06,female,1,2005, -3.092,3,2.9028,2.68,1039,10/21/2019 18:11,male,1,1959, -1.876,2.09266667,1.8132,1.30033333,1040,10/21/2019 18:08,male,1,1982, -4.205,0.979,1.3732,1.37633333,1041,10/21/2019 18:12,male,1,1994, -2.043,2.05325,1.58757143,1.515,1042,10/21/2019 18:16,female,1,1971, -2.3745,1.447,1.8452,1.45066667,1043,10/21/2019 18:25,male,1,1968, -1.3734,2.05066667,1.24057143,0.993,1044,10/21/2019 18:38,female,1,1971, -0.76308333,0.791,0.62453846,0.99566667,1045,10/21/2019 18:28,male,1,1985, -1.263,1.128,1.31075,0.74571429,1046,10/21/2019 18:29,female,1,1980, -0.856,0.467,0.685,1.257,1047,10/21/2019 18:29,male,1,1990, -0.55383333,0.69416667,0.78671429,0.66614286,1048,10/21/2019 18:26,male,1,1953, -0.913,0.969,0.99371429,1.177875,1051,10/21/2019 18:32,male,0,1986, -0.509,0.67514286,0.61991667,0.64214286,1052,10/21/2019 18:32,female,1,1985, -1.07171429,1.0775,1.21383333,1.0738,1053,10/21/2019 19:30,male,1,1981, -1.1592,1.13066667,1.01185714,1.167125,1054,10/21/2019 18:36,male,0,1988, -1.375,1.29,1.23685714,1.36933333,1055,10/21/2019 18:38,female,1,1967, -1.38542857,1.5496,1.403,1.2186,1056,10/21/2019 18:40,female,1,1958, -0.7714,0.86033333,1.3095,1.03933333,1057,10/21/2019 18:48,male,1,1984, -0.89883333,0.889625,1.10666667,1.0637,1057,10/22/2019 20:31,male,1,1984, -1.789,2.47833333,1.743,2.194,1058,10/21/2019 18:51,male,1,1954, -1.07333333,1.11425,1.104,1.85314286,1059,10/21/2019 18:52,male,1,1967, -0.67433333,0.68988889,1.04944444,0.746,1060,10/21/2019 18:56,female,1,1985, -0.69930769,0.74277778,0.7266,0.56908333,1061,10/21/2019 18:55,male,1,1983, -4.465,1.3074,3.6855,2.60325,1062,10/21/2019 18:56,female,1,1977, -0.77711111,0.80188889,0.85777778,1.15166667,1063,10/21/2019 19:09,female,1,1979, -0.7024,0.5988,0.94257143,0.73971429,1063,10/21/2019 19:19,female,1,1979, -1.049,0.855,0.92281818,0.7345,1064,10/21/2019 19:21,male,1,1981, -1.232,0.79655556,0.928375,0.8655,1064,10/21/2019 21:05,male,1,1981, -0.92325,1.15416667,1.0395,1.0215,1064,10/21/2019 19:18,male,1,1981, -0.53926667,0.6593,0.7507,0.64575,1066,11/5/2019 11:03,female,1,1971,3 -0.65864286,0.58208333,0.6769,0.6896,1066,11/9/2019 11:38,female,1,1971,3 -0.7042,0.63121429,0.766,0.641,1066,11/6/2019 12:02,female,1,1971,3 -0.77285714,0.675,0.73446154,0.6671,1066,11/10/2019 10:31,female,1,1971,3 -1.2166,1.36575,1.39314286,1.343,1066,10/21/2019 19:08,female,1,1971,3 -0.635625,0.55355556,0.623,0.73411111,1066,11/7/2019 15:32,female,1,1971,3 -0.75933333,0.60316667,0.608,0.703125,1066,11/4/2019 14:39,female,1,1971,3 -0.57585714,0.50783333,0.67316667,0.69209091,1066,11/8/2019 13:40,female,1,1971,3 -0.83425,0.64875,0.971625,0.60592857,1067,10/21/2019 19:13,male,1,1983, -0.69653333,0.9935,0.95428571,0.69816667,1068,10/22/2019 20:29,female,0,1981, -0.65825,0.8447,1.07957143,0.85925,1068,10/21/2019 19:14,female,0,1981, -0.6081,0.756,0.7722,0.60711111,1070,10/21/2019 19:33,male,1,1985, -0.88741667,0.9968,1.131,0.84971429,1071,10/21/2019 23:04,female,1,2000, -1.7365,1.382,1.74,1.38633333,1071,10/21/2019 19:26,female,1,2000, -2.95833333,1.072625,1.133,2.81,1072,10/21/2019 19:28,female,1,1977, -0.6535,0.82909091,0.828625,0.861625,1072,10/21/2019 19:29,female,1,1977, -1.4465,1.3,1.22133333,2.989,1075,10/21/2019 19:27,female,1,1967, -2.066,2.171,2.728,1.83028571,1076,10/21/2019 19:23,male,1,1968, -0.581375,0.60107692,0.65775,0.72869231,1078,10/21/2019 19:31,male,1,1985, -1.3835,1.874,1.996,1.64014286,1080,10/21/2019 19:30,female,1,1958, -1.789,1.51814286,1.43266667,1.84316667,1081,10/22/2019 20:28,male,1,1974, -0.83183333,0.91314286,1.30416667,0.98575,1081,10/21/2019 19:33,male,1,1974, -1.65833333,1.18266667,1.453,1.42375,1083,10/21/2019 19:49,female,1,1981, -1.321,1.425,1.25328571,1.446,1084,10/21/2019 20:15,female,1,1985, -0.69842857,0.739,0.70257143,0.90342857,1086,10/21/2019 19:34,male,1,1988, -1.94033333,1.58633333,1.9212,1.57966667,1087,10/21/2019 20:12,male,1,1975, -0.77783333,0.68758824,0.6962,0.782,1089,10/21/2019 19:38,female,1,1989, -0.404,1.13271429,1.0205,1.05816667,1090,10/21/2019 19:50,male,1,1967, -2,2.01857143,1.944,2.15433333,1091,10/21/2019 20:51,male,1,1953, -0.70190909,0.65154545,0.83444444,0.813375,1093,10/21/2019 19:44,male,1,1984, -2.835,2.126,1.837,1.589,1094,10/21/2019 20:37,male,1,1967, -2.353,3.0085,1.91375,3.136,1096,10/21/2019 19:48,female,1,1971, -0.70423077,0.87325,0.61444444,0.93616667,1098,10/21/2019 19:49,male,1,1986, -2.1582,2.26466667,1.4085,1.377,1100,10/21/2019 19:57,female,1,1981, -0.98044444,1.176,1.0935,1.0741,1101,10/21/2019 19:50,male,1,1956, -0.756125,0.73861538,0.8045,0.87244444,1102,10/21/2019 19:55,male,1,1986, -1.79433333,1.645125,0.907,1.22975,1103,10/21/2019 19:59,female,1,1972, -1.49,1.70333333,1.316,1.578,1104,10/21/2019 19:55,female,1,1950, -1.402,1.96466667,1.40433333,2.048,1105,10/21/2019 20:36,female,1,1963, -3.77025,3.512,2.954,2.122,1105,10/22/2019 20:26,female,1,1963, -0.73325,0.95,1.0015,0.7045,1106,10/21/2019 19:57,male,1,1988, -0.6546,0.76114286,0.82408333,0.914875,1108,10/21/2019 19:58,male,1,2000,4 -0.61866667,0.66881818,0.6885,0.66526667,1108,11/10/2019 22:02,male,1,2000,4 -0.60475,0.84733333,0.633,0.64392308,1108,11/5/2019 22:21,male,1,2000,4 -0.68841667,0.64,0.631,0.6376875,1108,11/10/2019 22:03,male,1,2000,4 -0.657375,0.847375,0.764,0.7691,1108,11/10/2019 22:00,male,1,2000,4 -0.6955,0.558,0.74375,0.6905,1108,11/10/2019 22:04,male,1,2000,4 -0.5938,0.6666,0.6235,0.6995,1108,11/10/2019 22:01,male,1,2000,4 -0.87527273,0.93828571,0.72972727,0.67475,1109,10/21/2019 20:02,male,1,1987, -0.71416667,0.73025,0.73216667,0.6822,1109,10/21/2019 21:14,male,1,1987, -0.84525,0.95109091,0.98122222,0.9125,1109,10/21/2019 20:03,male,1,1987, -0.573,0.78,0.54833333,0.76333333,1109,10/21/2019 21:15,male,1,1987, -0.8004,0.84592308,1.20028571,0.87071429,1109,10/21/2019 20:04,male,1,1987, -0.63125,0.72441667,0.93888889,0.717,1109,10/21/2019 20:01,male,1,1987, -0.71555556,0.98922222,0.98583333,0.7829,1109,10/21/2019 21:13,male,1,1987, -1.2701,1.2475,1.263,1.281,1110,10/21/2019 20:02,male,1,1974, -1.7515,1.52933333,2.23366667,1.992,1111,10/21/2019 20:10,female,1,1955, -1.48622222,1.604,1.86133333,1.8285,1112,10/21/2019 20:07,male,1,1958, -0.71755556,0.84066667,1.324,1.02044444,1113,10/21/2019 20:12,female,1,1985, -0.64233333,0.75490909,1.01533333,1.20928571,1114,10/21/2019 20:11,male,0,1975, -2.301,4.527,1.8255,2.79366667,1115,10/21/2019 20:12,female,0,1960, -1.5175,1.669,1.468,2.00175,1116,10/21/2019 20:12,male,1,1969, -2.31,2.5895,2.0515,2.03671429,1118,10/21/2019 20:16,male,1,1955, -1.22314286,1.46533333,1.3586,1.086,1119,10/21/2019 20:15,male,1,1965, -1.19225,0.99,2.22583333,0.9768,1121,10/21/2019 20:17,male,1,1980, -0.6533,0.56194118,0.61116667,0.78975,1123,10/21/2019 20:19,male,1,1986, -0.904,1.189,1.07122222,1.215875,1124,10/21/2019 20:19,male,1,1968, -1.24071429,1.52257143,1.28233333,1.2678,1125,10/21/2019 20:20,female,1,1959, -0.76925,0.97616667,1.07088889,1.16857143,1126,10/21/2019 20:22,female,1,1981, -0.74433333,1.014625,1.04316667,0.95788889,1127,10/21/2019 20:23,male,1,1971, -0.66254545,0.61691667,0.73833333,0.72845455,1128,10/21/2019 20:27,male,0,1982, -1.0674,1.05222222,0.98988889,1.0966,1129,10/21/2019 20:30,female,1,1975, -0.95828571,1.21971429,1.487,1.1408,1129,10/21/2019 20:31,female,1,1975, -0.73966667,0.87925,1.07816667,0.70044444,1129,10/21/2019 20:28,female,1,1975, -1.4625,1.716,1.92283333,1.43442857,1129,10/21/2019 20:32,female,1,1975, -0.8465,1.2974,1.0191,0.82428571,1129,10/21/2019 20:29,female,1,1975, -1.2426,1.3465,1.16871429,1.2662,1129,10/21/2019 21:19,female,1,1975, -1.43933333,2.006,1.70157143,1.15433333,1130,10/21/2019 20:31,female,1,1956, -0.545,0.48408333,0.52228571,0.88654545,1131,10/21/2019 20:36,male,1,1983, -8.0165,2.551,1.91033333,2.2515,1132,10/21/2019 20:37,female,1,1955, -2.735,1.918,2.1764,2.3565,1133,10/21/2019 20:35,female,1,1952, -1.845,1.6825,1.545,3.287,1134,10/21/2019 20:38,female,1,1971, -0.98866667,0.90666667,1.43125,0.78742857,1135,10/21/2019 20:38,female,1,1983, -1.21533333,1.1615,1.24383333,3.1215,1136,10/21/2019 20:40,male,1,1969, -1.3046,1.325,1.41342857,1.26925,1137,10/21/2019 22:33,male,1,1966, -1.205875,1.161,1.32366667,1.27225,1138,10/21/2019 21:11,male,1,1979, -1.22025,0.91785714,1.07788889,1.18228571,1139,10/21/2019 20:47,female,1,1986, -0.56,0.7366,1.0615,0.6085,1140,10/21/2019 20:49,male,1,1983, -1.7635,1.594,1.64975,3.504,1141,10/21/2019 20:50,female,1,1947, -1.6578,1.453,1.32828571,1.03133333,1142,10/21/2019 20:52,female,1,1974, -1.13985714,1.04183333,1.32066667,1.01685714,1143,10/21/2019 20:59,male,1,1963, -2.36633333,1.641,1.93766667,1.92,1145,10/21/2019 20:59,male,1,1976, -2.45733333,2.47833333,3.1805,2.88566667,1146,10/21/2019 21:04,male,1,1966, -1.9454,1.81425,1.5235,1.5605,1147,10/21/2019 21:05,male,1,1967, -1.0785,0.96866667,3.235,1.07,1148,10/21/2019 21:08,female,1,1964, -1.3006,1.58255556,1.522,1.4148,1149,10/21/2019 21:04,male,1,1958, -1.12475,0.96571429,0.99033333,0.91925,1150,10/21/2019 21:06,female,1,1975, -1.51633333,1.26925,1.6125,1.1536,1151,10/21/2019 21:05,male,1,1969, -1.2915,0.869,0.99963636,0.6945,1152,10/21/2019 21:14,male,0,1986, -0.63390909,1.117,0.90411111,0.95383333,1153,10/21/2019 21:14,female,1,1966, -1.3465,1.55975,0.97030769,1.37375,1153,10/21/2019 21:15,female,1,1966, -1.8915,2.002,2.03125,2.3038,1154,10/21/2019 21:17,male,1,1988, -3.13766667,2.68733333,1.567,1.9925,1155,10/21/2019 21:17,female,1,1947, -3.5105,3.3955,4.091,3.7465,1157,10/21/2019 21:20,female,0,1949, -0.75825,0.91933333,0.7265,1.44566667,1158,10/21/2019 21:20,female,1,1983, -1.3146,1.219625,1.22675,1.004,1159,10/21/2019 21:21,male,1,1966, -1.675,1.414875,1.4795,1.44966667,1161,10/21/2019 21:27,male,1,1963, -1.4245,2.105,2.0294,2.5046,1162,10/21/2019 21:28,female,1,1982, -1.102625,1.10633333,1.153,1.189,1163,10/21/2019 21:28,male,1,1955, -1.50125,1.087,1.361,1.02522222,1165,10/21/2019 21:32,male,1,1966, -2.35766667,2.1774,2.109,2.077,1166,10/21/2019 21:42,female,0,1966, -1.53825,2.16666667,1.5986,1.7928,1166,10/21/2019 21:45,female,0,1966, -2.19766667,2.6105,2.45466667,2.099,1166,10/21/2019 21:40,female,0,1966, -1.2452,1.82814286,0.975,1.114,1167,10/21/2019 21:34,male,1,1958, -0.9862,1.592,1.16171429,0.95985714,1168,10/21/2019 21:35,female,1,1984, -1.7672,1.576,1.8095,1.4795,1169,10/21/2019 21:44,female,1,1975, -1.43225,1.32583333,1.41785714,0.98566667,1170,10/21/2019 21:45,female,0,1977, -0.63614286,0.69435714,0.86163636,0.81471429,1171,10/21/2019 21:42,male,1,1989, -0.59854545,0.780125,0.8382,0.8152,1172,10/21/2019 21:45,male,1,1992, -1.01314286,1.14516667,1.18483333,1.14257143,1173,10/21/2019 21:53,male,1,1988, -1.1035,1.623,1.02742857,1.10583333,1174,10/21/2019 22:03,male,1,1972, -1.235,1.37816667,1.6755,1.064375,1175,10/21/2019 21:59,female,1,1981, -0.881,0.932,0.7607,0.93466667,1176,10/21/2019 22:01,male,1,1956, -1.80814286,2.12066667,1.356,0.890125,1177,10/21/2019 22:07,male,1,1964, -1.946,1.7495,1.523,1.8824,1178,10/21/2019 22:07,female,1,1986, -1.7462,1.374625,2.212,1.2774,1180,10/21/2019 23:00,male,1,1966, -1.82083333,2.0665,1.8515,1.91866667,1181,10/21/2019 22:24,female,1,1944, -1.0055,0.86225,1.17933333,0.97323077,1182,10/21/2019 22:33,female,1,1983, -0.67141667,0.55276923,0.823875,0.57921429,1183,10/21/2019 22:33,male,1,1977, -0.903625,0.89614286,0.71677778,0.80116667,1184,10/21/2019 22:46,female,1,1925, -2.4456,2.038,1.4895,2.58575,1185,10/21/2019 22:36,male,1,1968, -1.12725,1.58525,1.2714,1.13042857,1186,10/21/2019 22:58,female,1,1964, -0.58233333,0.58375,0.51013333,0.64353333,1187,10/21/2019 22:52,male,1,1981, -0.87266667,0.951125,1.0424,1.087125,1188,10/21/2019 22:54,male,1,1988, -1.09933333,1.05025,1.17285714,1.22533333,1189,10/21/2019 23:25,male,1,1959, -0.9835,0.92566667,0.9745,1.0404,1190,10/21/2019 23:22,female,0,2000, -0.8013,0.839625,0.735,0.91242857,1192,10/21/2019 23:39,female,1,1988, -1.7635,1.64433333,1.4985,1.841,1195,10/22/2019 1:12,male,1,1958, -1.76766667,1.28775,0.8745,1.06990909,1196,10/22/2019 19:52,male,1,1959, -1.4875,1.7102,1.7286,1.50116667,1196,10/22/2019 19:25,male,1,1959, -1.39366667,1.4135,1.591625,2.00066667,1197,10/22/2019 7:23,male,1,1964, -0.86128571,1.09966667,0.84145455,1.31983333,1198,10/22/2019 10:11,male,1,1988, -0.62281818,0.767,0.66266667,0.72363636,1199,10/22/2019 10:42,male,0,1988, -0.6807,0.72153333,0.708,0.8027,1200,10/22/2019 11:02,female,1,1979, -0.6807,0.72153333,0.708,0.8027,1200,10/22/2019 11:02,female,1,1979, -0.7338,0.67509091,0.68933333,0.74644444,1202,10/22/2019 11:17,male,1,1983, -0.7338,0.67509091,0.68933333,0.74644444,1202,10/22/2019 11:17,male,1,1983, -0.63546154,0.68728571,0.7382,0.82390909,1204,10/22/2019 11:30,male,1,1974, -0.63546154,0.68728571,0.7382,0.82390909,1204,10/22/2019 11:30,male,1,1974, -2.10133333,2.4145,1.9885,2.48375,1206,10/22/2019 11:43,male,1,1958, -0.627,0.521,0.66133333,0.8186,1207,10/22/2019 11:52,male,1,1983, -0.87291667,0.87414286,0.91216667,0.908625,1209,10/22/2019 11:50,male,1,1968, -0.87291667,0.87414286,0.91216667,0.908625,1209,10/22/2019 11:50,male,1,1968, -1.3716,1.22371429,1.851,1.7505,1210,10/22/2019 12:11,male,1,1974, -1.16171429,1.571,1.2232,1.02566667,1211,10/22/2019 12:20,male,1,1955, -1.02814286,0.859,0.8523,1.2828,1212,10/22/2019 12:29,male,1,1986, -1.35757143,1.545,1.38833333,1.228375,1213,10/22/2019 12:41,female,1,1982, -0.634875,0.84514286,0.66115385,0.79472727,1214,10/22/2019 12:57,female,1,1981, -0.60366667,0.59515385,0.64633333,0.71593333,1215,10/22/2019 12:59,male,1,1974, -1.55666667,2.144,1.58077778,1.54575,1216,10/22/2019 12:57,female,1,1961, -0.739375,0.9087,0.7752,0.79144444,1217,10/22/2019 13:01,male,1,1979, -1.7495,1.58433333,1.033,1.2065,1217,10/22/2019 16:45,male,1,1979, -0.69708333,0.90533333,0.7444,1.2005,1218,10/22/2019 13:12,male,1,1966, -0.56244444,0.63908333,0.631,0.563,1219,10/22/2019 13:14,female,1,1982, -1.8025,1.212,1.73033333,1.054,1219,10/22/2019 19:16,female,1,1982, -0.53927273,0.7865,0.58928571,0.9062,1220,10/22/2019 13:16,male,1,1984, -1.02377778,1.06622222,1.28933333,0.936,1222,10/22/2019 13:28,male,1,1959, -1.15466667,1.1614,1.048,1.1156,1223,10/22/2019 13:29,male,1,1976, -0.69283333,0.8484,0.67471429,0.678,1224,10/22/2019 13:31,male,1,1972, -1.368,0.81266667,1.567,1.223,1226,10/22/2019 13:57,male,1,1989, -0.66618182,0.78914286,0.81066667,0.79911111,1228,10/22/2019 14:00,female,1,1979, -1.027,0.947,1.06133333,2.6845,1229,10/22/2019 20:34,male,0,2000, -1.466,1.3956,1.555,1.46571429,1231,10/22/2019 14:12,male,1,1955, -1.41,1.5005,1.5002,1.7855,1232,10/22/2019 14:16,male,1,1965, -0.89866667,0.773,0.867,0.65745455,1233,10/22/2019 14:45,male,1,1974, -1.5942,1.006,0.815,1.2038,1234,10/22/2019 15:06,male,1,1988, -1.5405,1.192625,0.93233333,1.14385714,1236,10/22/2019 15:42,female,1,1964, -1.10142857,1.052625,0.829,1.1915,1237,10/22/2019 15:51,female,1,1989, -0.866,1.3055,1.095,1.19666667,1237,10/22/2019 15:52,female,1,1989, -1.57683333,1.0726,1.26133333,2.1286,1239,10/22/2019 23:01,male,1,1969, -1.085,0.80316667,0.87622222,1.0132,1241,10/22/2019 16:12,male,1,1989, -0.5212,0.5663,0.61583333,0.51390909,1242,10/22/2019 16:17,male,0,1982, -2.14114286,1.405,1.298,1.4715,1243,10/22/2019 16:35,female,1,1963, -1.0445,1.3005,1.56542857,0.97811111,1245,10/22/2019 16:36,female,1,1985, -1.336,1.43385714,1.60333333,1.438,1246,10/22/2019 16:41,female,1,1967, -1.74,2.198,1.9875,1.91366667,1248,10/22/2019 16:57,male,1,1955, -0.8275,0.81044444,0.9183,1.09416667,1249,10/22/2019 17:07,female,1,1980, -1.6428,1.28642857,1.73225,2.608,1250,10/22/2019 17:01,male,1,1948, -1.72425,1.4465,1.484875,1.3,1251,10/22/2019 18:51,female,1,1978, -2.19366667,2.5575,2.07833333,2.079,1252,10/22/2019 17:06,female,1,1958, -1.38366667,1.429875,1.3666,1.379,1254,10/22/2019 17:01,male,1,1973, -0.78271429,1.2982,1.03642857,1.42314286,1255,10/22/2019 19:22,female,0,1980, -1.514,1.39433333,1.57733333,1.66633333,1256,10/22/2019 21:44,male,1,1957, -1.45516667,1.0655,1.17266667,1.34325,1256,10/22/2019 21:46,male,1,1957, -1.34816667,1.3644,1.66225,7.268,1257,10/22/2019 17:13,female,1,1979, -1.5695,0.92966667,1.13385714,1.67366667,1258,10/22/2019 17:11,male,1,1964, -1.30466667,1.65725,2.98,2.074,1259,10/22/2019 17:14,female,1,1986, -1.76377778,2.15933333,1.5245,1.342,1260,10/22/2019 17:10,male,0,1947, -0.90744444,1.3945,1.03685714,1.030875,1261,10/22/2019 17:16,female,1,1988, -0.7002,0.8364,0.70630769,0.92266667,1262,10/22/2019 17:21,male,1,1975, -0.55922222,0.7511,0.58725,0.68854545,1263,10/22/2019 17:20,male,1,1985, -4.41733333,2.141,1.9275,2.2395,1264,10/22/2019 17:25,female,1,1969, -1.11533333,1.07111111,1.0506,1.13928571,1265,10/22/2019 17:55,female,1,1982, -0.7232,0.707,0.971125,0.81766667,1266,10/22/2019 17:39,male,1,1980, -0.6485,0.8435,0.70588889,0.75269231,1266,10/22/2019 17:32,male,1,1980, -1.25014286,0.85322222,0.78675,1.17683333,1267,10/22/2019 17:30,female,1,1984, -1.054,0.99958333,0.8978,0.81466667,1268,10/22/2019 17:39,female,1,1971, -0.842,1.18233333,1.092,0.90157143,1269,10/22/2019 17:30,female,1,1986, -1.11414286,0.92071429,1.128,1.63725,1271,10/22/2019 17:39,female,1,1957, -1.2922,1.50714286,1.0832,1.88533333,1271,10/22/2019 17:40,female,1,1957, -1.6566,1.724,1.78942857,1.73966667,1272,10/22/2019 17:44,female,1,1970, -0.64163158,0.697,0.6907,0.66514286,1273,10/22/2019 17:45,female,1,1984, -0.67992308,0.67357143,0.68236364,0.64411111,1274,10/22/2019 17:47,male,1,1983, -2.915,2.87633333,2.75933333,2.7,1275,10/22/2019 17:53,female,1,1968, -1.76433333,1.537375,1.3745,1.401,1276,10/22/2019 17:48,female,1,1980, -0.79655556,1.00033333,0.9825,1.088,1277,10/22/2019 17:51,male,1,1985, -2.291,0.9224,1.99822222,1.57233333,1278,10/22/2019 18:09,male,1,1978, -1.56675,2.047,1.479625,1.58233333,1279,10/22/2019 18:11,male,1,1951, -0.58909091,0.628,0.73357143,0.666,1280,10/22/2019 17:51,female,1,1980, -0.70214286,0.553375,0.77933333,0.82516667,1280,11/4/2019 8:09,female,1,1980, -1.417,1.7885,1.9704,1.714,1281,10/22/2019 17:51,male,1,1958, -1.87457143,1.291,1.2628,1.444,1282,10/22/2019 17:59,female,1,1977, -1.821,1.59666667,1.0515,1.32257143,1284,10/22/2019 18:03,male,1,1970, -0.88071429,0.61872727,0.66533333,0.7014,1285,10/22/2019 18:14,male,1,1979, -2.566,1.6045,1.2645,0.98866667,1286,10/22/2019 18:18,male,1,1961, -1.09157143,1.409,1.43116667,1.78725,1288,10/22/2019 18:19,female,0,1971, -0.59509091,0.92757143,0.75727273,0.63,1289,10/22/2019 18:07,male,1,1988, -0.82628571,0.76466667,0.7766,0.49211111,1290,10/22/2019 18:10,male,1,1987, -0.789,0.864,0.88575,0.925,1291,10/22/2019 18:17,male,1,1973, -1.1634,1.10833333,3.092,3.47,1292,10/22/2019 18:10,female,1,1944, -1.3475,1.3556,1.48366667,0.937,1293,10/22/2019 18:10,male,1,1971, -0.648,1.168,0.7406,1.26425,1294,10/22/2019 18:12,female,1,1971, -1.74166667,1.678,2.0296,1.36975,1295,10/22/2019 18:18,female,1,1982, -1.53733333,1.62216667,1.849,1.417125,1295,10/22/2019 18:19,female,1,1982, -1.17233333,0.9921,1.5678,1.23225,1296,10/22/2019 18:15,male,1,1967, -1.027,0.579,1.3,1.2855,1297,10/22/2019 18:21,female,1,1963, -0.9102,0.94833333,0.77427273,0.945,1298,10/22/2019 18:19,male,1,1987, -1.143,1.294375,1.29188889,1.42875,1300,10/22/2019 18:21,female,1,1978, -1.16976923,1.14533333,1.251,1.16233333,1301,10/22/2019 18:22,female,1,1978, -2.95866667,3.15233333,1.483,2.87133333,1302,10/22/2019 18:22,male,1,1964, -1.94,4.059,1.74133333,2.0256,1303,10/22/2019 18:35,male,1,1961, -0.904875,0.73725,0.89166667,0.8725,1304,11/4/2019 18:35,female,1,2000, -1.60116667,1.48433333,1.59566667,1.03933333,1304,10/22/2019 18:54,female,1,2000, -0.904875,0.73725,0.89166667,0.8725,1304,11/4/2019 18:35,female,1,2000, -2.9975,2.099,2.515,2.2585,1304,10/22/2019 19:17,female,1,2000, -1.4765,0.64006667,0.6235,0.83,1304,11/5/2019 9:53,female,1,2000, -2.46733333,1.6715,1.136,1.21216667,1304,10/22/2019 19:37,female,1,2000, -0.8983,0.85877778,0.71175,0.785,1304,11/6/2019 18:47,female,1,2000, -1.47366667,1.726,2.228,1.816,1305,10/22/2019 18:23,male,1,1964, -1.026,1.49,1.1485,1.19985714,1306,10/22/2019 18:27,male,1,1967, -1.3265,1.26425,0.92633333,0.87383333,1308,10/22/2019 18:27,female,1,1973, -0.8235,0.9695,1.34566667,1.37628571,1309,10/22/2019 18:27,male,1,1984, -0.7378,0.61953846,0.79228571,0.56966667,1310,10/22/2019 18:28,male,1,1984, -2.0415,2.08333333,2.08925,1.9334,1311,10/22/2019 18:28,male,1,1969, -0.6788,0.75614286,0.64225,0.81158333,1312,10/22/2019 18:55,male,0,1986, -0.9992,0.6399,0.76708333,1.27742857,1313,10/22/2019 18:35,female,1,1986, -2.264,1.688,1.097,1.91933333,1315,10/22/2019 21:16,female,1,1978, -1.197,1.21883333,2.03283333,1.2266,1315,10/22/2019 21:24,female,1,1978, -1.1838,1.70633333,0.89641667,1.201,1315,10/22/2019 21:28,female,1,1978, -1.351,2.3025,2.16483333,1.48025,1316,10/22/2019 18:35,male,1,1940, -0.7159,0.6815,0.661,0.70833333,1317,10/22/2019 18:30,female,1,1985, -0.932,1.276,1.57266667,1.0154,1318,10/22/2019 18:45,male,1,1969, -0.69025,0.71854545,0.812,0.68823077,1319,10/22/2019 18:37,male,1,1985, -3.639,2.5918,3.287,3.23466667,1321,10/22/2019 18:40,female,1,1947, -1.17283333,0.9933,1.22433333,1.17566667,1324,10/22/2019 18:55,male,1,1974, -0.563,0.608,0.78225,0.6291,1325,10/22/2019 18:43,male,1,1985, -0.6784,0.81471429,0.71915385,0.62215385,1326,10/22/2019 18:43,male,1,1986, -1.2505,0.928,0.95688889,0.544625,1327,10/22/2019 18:46,female,1,1982, -1.30457143,1.14,1.4826,1.8582,1328,10/22/2019 18:45,male,1,1942, -1.30457143,1.14,1.4826,1.8582,1328,10/22/2019 18:45,male,1,1942, -1.52014286,2.358,2.148,2.11183333,1328,10/22/2019 18:46,male,1,1942, -0.75333333,0.67325,0.7666,0.7164,1329,11/4/2019 7:38,male,0,2000,4 -0.6618,0.63592308,0.67915385,0.84385714,1329,11/8/2019 8:07,male,0,2000,4 -0.76722222,0.63511111,0.7935,0.719,1329,11/5/2019 7:44,male,0,2000,4 -0.6635,0.656,0.59792308,0.727375,1329,11/11/2019 23:35,male,0,2000,4 -0.63345455,0.68409091,0.986125,0.719,1329,11/6/2019 8:04,male,0,2000,4 -0.67364286,0.660625,0.60141667,0.89177778,1329,10/22/2019 18:49,male,0,2000,4 -0.76883333,0.65416667,0.67177778,0.73242857,1329,11/7/2019 7:37,male,0,2000,4 -2.24125,0.77257143,1.36042857,1.4515,1330,10/22/2019 18:50,male,1,1982, -1.472,1.3126,2.188,2.0444,1332,10/22/2019 18:53,male,1,1957, -3.2615,1.55483333,1.3364,1.3714,1333,10/22/2019 18:53,male,1,1967, -0.98413333,0.8884,1.07133333,1.0065,1335,10/22/2019 18:52,female,1,1968, -2.37266667,2.0385,2.076,2.455,1336,10/22/2019 18:53,female,1,1949, -2.37266667,2.0385,2.076,2.455,1336,10/22/2019 18:53,female,1,1949, -2.37266667,2.0385,2.076,2.455,1336,10/22/2019 18:53,female,1,1949, -1.05,1.149,1.05675,1.27366667,1337,10/22/2019 18:52,male,0,1975, -0.6073,0.59361538,0.69333333,0.68181818,1338,10/22/2019 18:52,male,1,1987, -0.60776923,0.49028571,0.56118182,0.60228571,1340,10/22/2019 19:03,male,1,1984, -0.88783333,0.776,1.08118182,2.13975,1341,10/22/2019 21:20,male,1,2001, -0.631,1.032,0.9466,0.65875,1341,10/22/2019 21:26,male,1,2001, -0.7666,0.726,0.90409091,1.34228571,1341,10/22/2019 21:21,male,1,2001, -0.65135294,0.61718182,0.67521429,0.693,1341,10/22/2019 21:23,male,1,2001, -0.744,0.6065,1.0269,1.12514286,1341,10/22/2019 21:25,male,1,2001, -0.764,1.07375,1.039,0.71516667,1342,10/22/2019 19:04,male,1,1984, -2.43366667,1.9904,2.056,1.213,1343,10/22/2019 19:14,male,1,1949, -1.05238462,0.58171429,0.67871429,0.53792308,1343,11/11/2019 22:09,male,1,1949, -0.492,0.51322222,0.36146667,0.61222222,1343,11/11/2019 22:10,male,1,1949, -0.6767,0.96818182,0.76071429,0.678,1344,10/22/2019 19:02,female,1,1989, -0.6515,0.6514,0.61289474,0.69372727,1345,10/22/2019 19:01,male,1,1972, -0.8387,0.53566667,0.8108,0.78876923,1346,10/23/2019 0:19,male,1,2000, -1.03971429,1.028,0.917875,1.07755556,1347,10/22/2019 19:03,male,1,1989, -0.666,1.02771429,0.8945,1.16957143,1349,10/22/2019 19:07,female,1,1986, -1.05,0.6968,1.0265,0.9805,1350,10/22/2019 19:15,female,1,1997, -0.965,0.547,0.524,0.93,1351,10/22/2019 19:09,female,1,1979, -0.58094118,0.7872,0.68661538,0.7054,1352,10/22/2019 19:09,male,1,1985, -1.12772727,1.71833333,0.8234,1.422,1353,10/22/2019 19:11,male,1,1966, -0.99827273,0.93142857,1.2176,1.2746,1354,10/22/2019 19:13,male,1,1988, -0.62813333,0.6646,0.61154545,0.93271429,1355,10/22/2019 19:13,male,1,1960, -2.09185714,1.74833333,1.484,1.043,1359,10/22/2019 19:19,male,1,1975, -1.127,0.8969,0.85166667,0.80585714,1360,10/22/2019 19:20,male,1,1984, -0.89772727,0.8558,1.171,0.915,1362,10/22/2019 19:19,male,1,1969, -1.64066667,0.5815,1.455875,1.462125,1363,10/22/2019 19:23,male,1,1958, -1.2402,1.0772,0.88325,1.2015,1364,10/22/2019 19:22,female,1,1960, -1.0168,1.0344,1.2063,0.945625,1365,10/22/2019 19:22,female,1,1988, -1.00266667,0.695,1.098125,1.4665,1366,10/22/2019 19:27,male,1,1965, -1.04766667,0.97866667,1.093,1.14322222,1367,10/22/2019 19:23,male,1,1956, -1.8685,1.9418,2.6045,2.116,1368,10/22/2019 19:28,male,0,1957, -1.77775,1.8545,2.162,2.9275,1369,10/22/2019 19:32,female,1,1956, -0.57278571,0.8185,0.76241667,0.82133333,1370,10/22/2019 19:35,male,1,1999, -0.69422222,1.114,0.72413333,0.64485714,1370,10/27/2019 2:44,male,1,1999, -1.54357143,1.3164,1.323,1.351,1371,10/22/2019 19:49,male,1,1964, -0.61,0.619,0.62370588,0.60344444,1371,11/10/2019 14:24,male,1,1964, -0.5152,0.609875,0.52338889,0.62375,1371,11/10/2019 14:29,male,1,1964, -1,0.4995,0.70825,0.6202,1371,10/22/2019 19:48,male,1,1964, -0.79328571,0.92257143,0.78185714,0.6352,1372,10/22/2019 19:31,male,1,1974, -0.73485714,0.75522222,0.958,0.814,1373,10/22/2019 19:35,male,1,1986, -3.4555,1.907,1.34885714,2.0795,1374,10/22/2019 19:34,male,1,1948, -2.0695,1.33366667,1.64583333,1.73275,1375,10/22/2019 19:38,female,1,1976, -1.54633333,1.85933333,1.47783333,1.2635,1377,10/22/2019 19:40,female,1,1959, -0.947,0.66644444,0.8688,0.69033333,1378,10/22/2019 19:42,male,1,1988, -0.6385,0.63611111,1.02055556,0.66911111,1379,10/22/2019 19:46,male,1,1969, -1.681375,2.0944,1.448,1.941,1380,10/22/2019 19:47,female,1,1974, -1.46175,1.4635,1.3745,1.385,1380,10/22/2019 20:40,female,1,1974, -1.22266667,1.96233333,1.4355,1.11671429,1382,10/22/2019 19:46,male,1,1958, -2.58733333,2.02366667,2.56533333,2.377,1383,10/22/2019 19:49,female,1,1974, -1.6084,1.1445,0.89533333,0.848,1384,10/22/2019 19:56,male,1,1983, -0.84881818,1.0915,0.85125,1.13588889,1386,10/22/2019 19:53,female,1,1980, -0.68090909,0.63741667,0.72857143,0.63842857,1387,10/22/2019 19:54,male,1,1977, -0.83,0.697,0.65771429,0.94275,1388,10/22/2019 20:06,male,1,2002, -1.0378,1.23616667,1.22114286,1.199,1389,10/22/2019 19:55,male,1,1989, -1.1155,1.1792,1.36025,1.22033333,1390,10/22/2019 19:56,female,1,1983, -2.681,2.68575,2.609,2.4935,1391,10/22/2019 20:01,female,1,1963, -1.159125,2.959,1.592,1.31775,1392,10/22/2019 19:56,male,0,1975, -0.825,0.89325,1.00911111,0.96033333,1393,10/22/2019 19:58,male,1,1989, -1.03816667,0.79588889,0.986,1.05616667,1394,10/22/2019 20:02,female,1,1988, -0.76511111,0.88242857,1.10833333,0.62181818,1395,10/22/2019 20:08,female,1,1984, -0.699,0.6905,0.67383333,0.641,1395,10/22/2019 20:22,female,1,1984, -1.265375,0.85533333,1.69175,1.230875,1396,10/22/2019 23:41,male,1,1944, -1.5984,1.40575,1.08,1.799875,1397,10/22/2019 20:05,female,1,1969, -0.75566667,0.68169231,0.65445455,0.77777778,1398,10/22/2019 20:05,male,1,2000,4 -0.70675,0.6941,0.61311111,0.63938462,1398,11/6/2019 7:08,male,1,2000,4 -0.64736364,0.666,0.8968,0.883,1398,11/3/2019 13:18,male,1,2000,4 -0.6242,0.5518,0.61566667,0.65775,1398,11/8/2019 7:09,male,1,2000,4 -0.66511111,0.75309091,0.64788889,0.7026,1398,11/4/2019 7:06,male,1,2000,4 -0.69444444,0.62030769,0.62972727,0.69216667,1398,11/9/2019 7:06,male,1,2000,4 -0.72566667,0.8888,0.68271429,0.8586,1398,11/5/2019 7:13,male,1,2000,4 -0.66821429,0.5955,0.634,0.64933333,1398,11/10/2019 9:51,male,1,2000,4 -7.217,2.754,3.759,3.914,1399,10/22/2019 20:10,female,1,1966, -1.35133333,1.78575,1.11172727,1.2874,1400,10/22/2019 20:38,female,1,2000, -0.697,0.89127273,0.59288889,0.64723077,1400,10/22/2019 20:08,female,1,2000, -0.54766667,0.6075,0.56236364,0.62654545,1400,10/22/2019 20:50,female,1,2000, -0.66236364,0.99255556,0.70033333,0.73428571,1400,10/22/2019 20:22,female,1,2000, -1.59966667,1.4565,1.243,1.029,1400,10/22/2019 20:26,female,1,2000, -2.64625,1.251,1.518,0.857,1401,10/22/2019 20:09,male,1,1972, -0.59353333,0.688625,0.68046154,0.60344444,1402,10/22/2019 20:08,male,1,1973, -1.0518,1.12688889,1.06983333,1.4048,1403,10/22/2019 20:09,male,1,1971, -0.94988889,1.8095,1.674,1.115375,1404,10/22/2019 20:09,female,0,1968, -1.51033333,1.739,1.42233333,1.5165,1405,10/22/2019 20:14,male,1,1966, -1.51885714,1.754,1.541,1.735,1405,10/22/2019 20:15,male,1,1966, -1.558,1.432,0.98116667,0.99985714,1406,10/22/2019 20:14,female,1,2000, -1.79833333,2.8215,1.94925,2.0475,1407,10/22/2019 20:22,female,1,1967, -1.22966667,1.49683333,1.3528,2.084,1408,10/22/2019 20:14,male,1,1983, -0.6092,0.6289,0.5409375,0.63088889,1409,10/22/2019 20:14,male,1,1989, -1.07357143,0.6165,0.7374,0.741375,1410,10/22/2019 20:16,male,1,1981, -0.8945,1.3454,1.481,1.03366667,1411,10/22/2019 20:18,male,1,1956, -2.574,1.97,2.2225,2.5755,1412,10/22/2019 20:19,female,0,1948, -0.50616667,0.504,0.52827273,0.627,1413,10/22/2019 20:20,male,1,1987, -1.04766667,0.73193333,0.81288889,0.91244444,1414,10/22/2019 20:24,male,1,1968, -1.04333333,0.9164,1.12533333,1.479125,1416,10/22/2019 20:23,male,1,1980,3 -1.22966667,0.89077778,1.0811,1.5575,1416,10/22/2019 20:38,male,1,1980,3 -0.59845455,0.81114286,0.65272727,0.69942857,1417,10/22/2019 20:23,male,1,2002, -1.21275,1.228,1.73528571,1.1228,1419,10/22/2019 21:00,male,1,1969, -0.68566667,0.811,1.294,0.922,1423,10/22/2019 20:29,male,1,1985, -0.973625,0.9163,0.92588889,0.74233333,1424,10/22/2019 20:30,male,1,1965, -1.174,0.90725,0.96783333,1.04114286,1425,10/22/2019 20:33,female,1,1968, -0.76388889,0.71054545,0.79475,0.824,1426,10/22/2019 20:33,male,1,1988, -2.357,2.52,1.872,1.86783333,1427,10/22/2019 20:54,male,1,1952, -0.92566667,0.810875,0.77844444,0.7255,1428,10/22/2019 20:34,male,1,1988, -1.06544444,0.95514286,0.97716667,0.84388889,1429,10/22/2019 20:36,female,1,1975, -0.71185714,0.89375,0.66475,0.81684615,1430,10/22/2019 20:37,male,1,1988, -1.6435,1.537,1.6,1.56216667,1432,10/22/2019 20:42,female,0,1979, -0.75416667,0.84585714,0.71627273,0.880625,1433,10/22/2019 20:43,female,1,2001, -0.81957143,0.79144444,0.81533333,0.9312,1434,10/22/2019 20:44,male,1,1986, -0.49,0.8345,0.673,0.73566667,1435,10/22/2019 21:19,male,1,1998, -0.8665,0.69390909,1.015375,0.981,1437,10/22/2019 20:49,male,1,1980, -0.99344444,1.079,0.86642857,0.96916667,1438,10/22/2019 20:45,male,0,1987, -1.33,1.227,1.22066667,1.0355,1439,10/22/2019 20:47,male,1,1967, -1.358125,1.09542857,1.1268,1.0534,1440,10/22/2019 20:49,female,1,1973, -1.57225,1.176,1.239,1.703,1441,10/22/2019 20:46,female,1,1987, -1.06925,1.49233333,1.20066667,1.396,1442,10/22/2019 20:50,male,0,1957, -0.63766667,0.8571,0.73883333,0.75983333,1442,11/4/2019 7:41,male,0,1957, -1.65833333,0.96890909,0.94892308,1.118,1443,10/22/2019 20:49,female,1,1972, -1.31233333,1.3375,1.11683333,1.4712,1444,10/22/2019 20:50,male,1,1973, -1.2555,1.22375,1.74466667,1.3318,1445,10/22/2019 20:49,male,1,1986, -3.12633333,3.6995,3.761,4.254,1446,10/23/2019 0:16,female,1,1948, -0.68681818,0.7301,0.86044444,0.6645,1447,10/22/2019 20:51,male,1,1977, -1.337,1.346,1.3855,1.35614286,1448,10/22/2019 20:55,male,1,1958, -0.9158,0.8752,0.98809091,0.98722222,1449,10/22/2019 20:53,female,1,1980, -2.12875,3.138,2.9325,3.0185,1450,10/22/2019 20:56,male,1,1968, -1.15885714,3.526,1.151,2.239,1451,10/22/2019 20:56,female,1,1976, -0.97488889,1.12375,0.86575,1.120875,1452,10/22/2019 21:41,male,1,1975, -1.3665,1.23866667,1.66275,1.51033333,1453,10/22/2019 21:00,male,1,1977, -0.949,0.91788889,0.79627273,0.79166667,1454,10/22/2019 21:03,male,1,1976, -0.71188889,0.721625,0.62214286,0.52457143,1455,10/22/2019 21:04,male,1,1987, -0.77255556,1.01442857,0.7234,0.8136,1456,10/22/2019 21:08,male,1,1972, -1.1974,1.21,1.16242857,1.565,1457,10/22/2019 21:07,female,1,1990, -0.608,0.56753333,0.704625,0.487,1458,10/22/2019 21:07,male,1,1986, -1.5845,2.41433333,2.50433333,1.883,1459,10/22/2019 21:12,male,1,1954, -1.9535,2.69366667,1.987,3.663,1460,10/22/2019 21:14,female,1,1984, -1.345,0.584,0.63325,0.628,1461,10/22/2019 21:17,female,1,1999, -1.1552,0.95475,0.9525,1.205,1462,10/22/2019 21:13,female,1,1964, -1.8155,1.7376,1.60266667,2.044,1463,10/22/2019 21:15,female,0,1964, -0.638875,0.501,0.660625,0.82757143,1464,10/22/2019 21:14,female,1,1983, -0.6125,0.531,0.516,0.65688889,1466,10/22/2019 21:15,male,1,1986, -0.71983333,0.771,0.82111111,1.0852,1467,10/22/2019 21:21,male,1,1985, -0.672625,0.62985714,0.59892308,0.63483333,1468,10/22/2019 21:30,male,1,2001, -1.17916667,2.22733333,1.639,1.67,1469,10/22/2019 21:22,male,1,1956, -2.758,3.01333333,2.797,2.90866667,1470,10/22/2019 21:24,female,1,1945, -1.332,1.3404,1.22175,1.7305,1472,10/22/2019 21:30,female,0,1978, -2.2524,3.19566667,3.042,2.709,1473,10/22/2019 21:33,male,1,1958, -0.94,1.09425,1.17825,0.897,1474,10/22/2019 21:34,male,1,1967, -0.55363636,1.4706,0.73218182,0.767,1476,10/22/2019 21:35,male,1,1986, -0.767625,0.64275,0.7201,0.77536364,1477,10/22/2019 21:37,male,1,1995, -1.42325,0.73642857,0.81885714,1.09557143,1478,10/22/2019 21:39,male,1,1988, -1.48033333,1.1825,1.06416667,1.03614286,1479,10/22/2019 21:40,male,0,1965, -1.05985714,1.06775,1.6624,1.20775,1480,10/22/2019 22:27,male,1,1986, -0.77975,0.77533333,0.98575,0.72141667,1481,10/22/2019 21:50,male,1,1966, -0.77975,0.77533333,0.98575,0.72141667,1481,10/22/2019 21:50,male,1,1966, -1.11066667,1.12875,1.1046,1.14916667,1482,10/22/2019 21:50,male,1,1964, -1.532,2.88833333,2.406,1.44,1483,10/22/2019 21:55,male,1,1956, -1.4925,1.208,1.4805,1.60133333,1484,10/22/2019 21:59,female,1,1974, -1.004875,0.843375,1.1295,1.11914286,1485,10/22/2019 21:55,male,1,1976, -0.49673333,0.5916,0.63669231,0.47163636,1487,11/10/2019 15:48,male,1,2000, -0.55838462,0.83283333,0.605,0.609625,1487,10/22/2019 22:10,male,1,2000, -0.59788889,0.55646667,0.5945,0.5616875,1487,11/10/2019 16:14,male,1,2000, -0.5766,0.58058333,0.5826,0.55111111,1487,11/10/2019 14:51,male,1,2000, -0.50211765,0.55583333,0.705,0.54226667,1487,11/10/2019 16:27,male,1,2000, -0.56876471,0.48771429,0.58421429,0.636,1487,11/10/2019 15:17,male,1,2000, -0.52866667,0.46326316,0.55991667,0.52525,1487,11/10/2019 16:38,male,1,2000, -1.12975,1.20925,1.41214286,1.161,1488,10/22/2019 22:33,male,1,1988, -2.2085,1.89166667,2.74133333,2.416,1490,10/22/2019 22:12,male,1,1985, -3.9595,4.485,3.2235,2.811,1490,10/22/2019 22:24,male,1,1985, -2.049,1.57333333,1.6045,1.641,1491,10/22/2019 22:11,male,1,1956, -1.63266667,1.7185,2.11766667,1.64114286,1492,10/22/2019 22:12,male,1,1988, -0.65033333,0.58766667,0.6025,0.65733333,1493,10/22/2019 22:14,male,1,1988, -4.1645,4.243,3.22466667,3.2785,1494,10/22/2019 22:23,male,1,1958, -2.985,2.785,3.701,3.145,1494,10/22/2019 23:35,male,1,1958, -0.96114286,0.9016,0.84333333,1.08266667,1495,10/22/2019 22:18,male,1,1986, -0.97633333,1.0658,1.209125,0.8311,1496,10/22/2019 22:24,female,1,1986, -0.61527273,0.45466667,0.69244444,0.71007692,1498,10/22/2019 22:18,male,1,1997, -2.20275,1.46275,1.7264,1.3312,1500,10/22/2019 22:21,male,1,1986, -0.7115,0.8252,0.733,0.86077778,1501,10/22/2019 22:22,male,1,1990, -2.002,1.88514286,1.5785,1.76133333,1503,10/22/2019 22:25,female,1,1976, -0.983,0.90844444,1.59785714,1.108,1504,10/22/2019 22:23,male,1,1962, -0.66375,0.6675,0.786,0.725,1505,10/22/2019 22:29,male,1,1985, -1.150125,0.992,1.09471429,1.0795,1508,10/22/2019 22:30,male,1,1987, -0.86866667,0.68433333,0.74177778,0.9328,1509,10/22/2019 22:31,male,1,1989, -0.9429,0.83628571,0.82090909,0.9226,1510,10/22/2019 22:37,male,1,1970, -0.83866667,0.58528571,0.647125,0.614,1511,10/22/2019 22:37,female,1,1988, -1.955,3.889,1.95033333,2.16066667,1512,10/22/2019 22:39,female,1,1978, -0.99428571,0.8785,0.903,1.1722,1513,10/22/2019 22:38,male,1,1971, -0.60572727,0.67871429,0.7585,0.66954545,1514,10/22/2019 22:46,male,1,1986, -3.26,2.9975,1.79025,3.3815,1515,10/22/2019 22:53,female,1,1964, -2.905,2.9605,1.8905,2.6505,1516,10/22/2019 22:47,female,0,1976, -0.56884615,0.5645,0.50557143,0.602125,1517,10/22/2019 22:47,male,1,1986, -1.3848,1.35085714,1.60925,1.1792,1518,10/22/2019 22:54,male,1,1966, -0.97066667,1.20185714,1.7145,1.37033333,1519,10/22/2019 22:47,male,1,1964, -5.237,4.9265,3.642,3.54233333,1520,10/22/2019 22:52,female,1,1953, -1.243,1.048625,1.38133333,1.40157143,1521,10/22/2019 22:54,male,1,1966, -1.01777778,0.8628,1.1418,1.162,1522,10/22/2019 22:53,female,1,1975, -1.6575,1.3724,1.27983333,1.0004,1523,10/22/2019 22:55,female,1,1985, -1.7315,1.40044444,1.196,1.7205,1524,10/22/2019 22:55,female,1,1947, -0.96328571,0.817,1.48633333,1.17771429,1525,10/22/2019 23:00,male,1,1986, -0.97033333,1.1465,1.28022222,0.82871429,1526,10/22/2019 23:18,female,1,1987, -0.91,0.88442857,0.83255556,0.888,1528,10/22/2019 23:06,female,1,1981, -1.0665,0.92116667,1.5065,1.038125,1529,10/22/2019 23:05,female,1,1969, -0.802,0.639,0.89866667,1.051625,1530,10/22/2019 23:11,male,1,1973, -1.573,3.089,1.96142857,2.26,1532,10/22/2019 23:13,male,0,1965, -0.62314286,0.628,0.56509091,0.80527273,1533,10/22/2019 23:12,male,1,1981, -0.70025,0.71863636,0.80166667,1.02266667,1535,10/22/2019 23:14,male,1,1999, -0.84472727,0.87,0.962375,0.9725,1536,10/22/2019 23:15,female,1,1986, -0.94466667,1.035,0.90636364,0.9668,1537,10/22/2019 23:19,male,1,1973, -1.681,1.643,1.433625,1.52625,1539,10/22/2019 23:19,female,1,1975, -2.798,1.34883333,0.8755,1.05925,1540,10/22/2019 23:19,female,1,1984, -0.98314286,0.97441667,0.92233333,1.126,1541,10/22/2019 23:21,male,1,1968, -1.1536,0.87975,1.32644444,0.95,1542,10/22/2019 23:30,male,1,1985, -0.64116667,0.5979,0.6504,0.79791667,1543,10/22/2019 23:23,male,1,1989, -0.74230769,0.85588889,0.8775,1.01566667,1544,10/23/2019 1:09,male,1,1989, -3.9715,3.419,3.38433333,2.9185,1545,10/22/2019 23:30,female,1,1954, -0.60308333,0.48333333,0.5248,0.732,1546,10/23/2019 0:17,male,1,1997, -0.6452,0.76916667,0.8191,0.85675,1547,10/22/2019 23:31,female,1,1980, -0.758375,0.7499,0.7245,0.97066667,1548,10/22/2019 23:32,male,1,1985, -1.0668,1.2464,1.0405,1.06977778,1550,10/22/2019 23:36,male,1,1968, -1.8785,1.5548,1.73575,1.656,1552,10/22/2019 23:37,female,1,1970, -0.62088889,0.66392857,0.88585714,0.71858333,1553,10/22/2019 23:38,male,1,1976, -0.59291667,0.72109091,0.64372727,0.60284615,1555,10/22/2019 23:41,male,1,2000,4 -0.52226667,0.55713333,0.63016667,0.96433333,1555,11/23/2020 13:44,male,1,2000,4 -1.05575,2.1595,2.252,1.59575,1557,10/22/2019 23:44,male,1,1964, -1.74666667,1.77025,1.566,1.803,1558,10/22/2019 23:50,male,1,1948, -0.65172727,0.53957143,0.6735625,0.4142,1559,10/22/2019 23:50,male,1,1977, -0.66181818,0.73491667,0.7256,0.776625,1560,10/22/2019 23:54,male,1,1963, -1.154,1.23577778,1.25175,1.195,1560,10/23/2019 0:10,male,1,1963, -0.926125,1.06716667,1.14022222,0.9292,1561,10/22/2019 23:54,female,1,1986, -1.8625,2.2256,1.74733333,2.12575,1563,10/22/2019 23:57,male,1,1962, -0.6676,0.63930769,0.71063636,0.52515385,1564,10/23/2019 0:00,male,1,1973, -1.05257143,1.29675,1.056125,1.09175,1565,10/22/2019 23:58,male,1,1967, -1.286,1.6748,1.293,1.12342857,1566,10/23/2019 0:03,male,1,1977, -4.015,4.945,4.141,4.205,1568,10/23/2019 0:10,male,1,1942, -1.86266667,1.5498,2.653,2.2612,1569,10/23/2019 0:10,female,1,1947, -1.5768,1.799,1.5395,2.2986,1569,10/23/2019 0:25,female,1,1947, -0.91216667,1.172125,0.771125,1.191,1570,10/23/2019 0:10,male,1,1981, -0.62672727,0.82783333,1.10714286,1.13377778,1571,10/23/2019 0:14,female,1,1973, -1.592,0.8972,0.8085,1.0098,1572,10/23/2019 1:13,male,1,1988, -0.66331579,0.6415,0.8846,0.62709091,1573,10/23/2019 0:18,female,1,1983, -0.8078,1.8124,1.777,1.23016667,1574,10/23/2019 0:25,male,1,1973, -2.528,2.991,2.23675,2.604,1575,10/23/2019 0:26,male,1,1962, -1.22590909,1.19383333,1.421,1.5355,1577,10/23/2019 0:40,male,1,1985, -0.93088889,1.14166667,1.084,1.4518,1577,10/23/2019 0:48,male,1,1985, -1.05871429,0.96722222,0.94485714,1.069,1578,10/23/2019 0:33,male,1,1965, -3.042,2.9798,2.425,1.604,1579,10/23/2019 0:35,female,1,1976, -0.63091667,0.60255556,0.68488889,0.72942857,1580,10/23/2019 0:34,male,1,1986, -0.837,0.97083333,1.0125,1.20385714,1581,10/23/2019 0:38,female,1,1988, -2.8135,1.67883333,1.76025,1.59525,1582,10/23/2019 0:39,male,1,1960, -2.56033333,4.0225,2.668,2.605,1583,10/23/2019 0:38,female,1,1956, -1.02925,0.8381,1.02257143,0.91433333,1584,10/23/2019 0:43,male,1,1984, -1.15116667,1.4015,0.89641667,1.6015,1585,10/23/2019 0:44,female,1,1945, -0.68225,0.71918182,0.77388889,0.9159,1586,10/23/2019 0:47,male,1,1979, -3.343,2.178,2.30533333,4.876,1587,10/23/2019 0:52,female,1,1942, -1.0452,0.913,0.74122222,0.77116667,1588,10/23/2019 0:53,male,1,1972, -1.563,1.88175,2.28533333,1.67633333,1589,10/23/2019 0:56,female,1,1957, -0.92242857,0.80975,0.9465,0.9276,1592,10/23/2019 1:01,male,1,1989, -1.032625,1.4896,1.02418182,1.2,1593,10/23/2019 1:00,female,1,1988, -1.01842857,1.01636364,0.9926,1.09183333,1594,10/23/2019 1:07,female,1,1987, -0.68,0.569,0.82142857,0.77525,1595,10/23/2019 1:09,female,1,1989, -0.669,1.0418,0.814,0.755,1596,10/23/2019 1:11,male,1,1986, -0.905,0.75081818,1.1515,0.96175,1597,10/23/2019 1:11,male,1,1975, -1.1795,0.921,1.15485714,1.174,1599,10/23/2019 1:16,male,1,1975, -0.686875,0.54485714,0.7052,0.881,1600,10/23/2019 1:25,male,1,1987, -1.10725,1.15755556,1.171375,1.40525,1602,10/23/2019 1:29,female,1,1965, -2.7566,1.969,2.01425,2.707,1604,10/23/2019 1:37,male,1,1950, -1.2004,0.91016667,0.994875,0.9912,1605,10/23/2019 1:38,male,1,1967, -1.48866667,1.467,1.5375,1.79225,1606,10/23/2019 1:40,male,1,1964, -0.93025,0.65744444,0.88785714,1.10011111,1607,10/23/2019 1:56,male,1,1977, -0.8375,0.67925,0.79716667,0.80123077,1608,10/23/2019 1:48,female,1,1985, -2.34925,2.523,2.47966667,2.0875,1610,10/23/2019 1:55,male,1,1944, -1.28,0.91142857,1.212,1.0178,1612,10/23/2019 2:19,female,0,1980, -0.64316667,0.531,0.65525,0.73633333,1613,10/23/2019 2:18,male,1,1970, -0.98988889,1.1948,1.183,1.22428571,1614,10/23/2019 2:27,male,1,1989, -0.61436364,0.62653333,0.76133333,0.60053333,1615,10/23/2019 2:29,female,1,1982, -0.54133333,0.4539375,0.58535714,0.55654545,1616,10/23/2019 2:30,male,1,1987, -1.02542857,1.08933333,0.97322222,1.07042857,1617,10/23/2019 2:37,male,1,1970, -0.78411111,1.185,0.84922222,0.9198,1617,10/23/2019 2:36,male,1,1970, -2.704,2.1565,1.98925,2.817,1619,10/23/2019 2:52,male,1,1948, -1.5838,1.27483333,1.2146,1.20616667,1620,10/23/2019 2:54,male,1,1967, -2.4595,2.26833333,1.8215,2.1595,1621,10/23/2019 3:04,male,1,1966, -1.908,1.39575,1.406,1.37816667,1622,10/23/2019 3:02,male,1,1958, -0.689,0.7054,0.67314286,0.590875,1623,10/23/2019 3:07,male,1,1987, -2.16225,1.6165,1.7065,1.6335,1624,10/23/2019 3:15,male,1,1943, -4.198,2.1545,2.39333333,2.094,1624,10/23/2019 3:17,male,1,1943, -0.66423077,0.71433333,0.8726,0.96875,1625,10/23/2019 4:10,male,1,1986, -1.535,1.53733333,1.01225,1.33775,1626,10/23/2019 4:16,male,1,1957, -2.627,2.39666667,4.02,2.448,1627,10/23/2019 6:19,male,1,1964, -2.62333333,1.61525,1.2155,0.71675,1630,10/23/2019 15:20,female,1,1999, -0.95271429,0.92625,0.8957,0.9682,1632,10/23/2019 15:42,female,1,1988, -2.27775,1.6155,1.6788,2.523,1633,10/23/2019 16:04,female,1,1963, -1.095,0.88466667,1.035,0.969,1636,10/23/2019 17:11,female,1,1986, -0.855125,1.145375,0.76375,1.02625,1639,10/24/2019 15:27,male,1,1990, -0.957,0.551,1.05475,0.99133333,1640,10/24/2019 15:47,male,1,1982, -2.371,2.911,2.20233333,2.72366667,1641,10/26/2019 16:37,male,1,1965, -0.82928571,0.85814286,0.74425,0.68566667,1643,10/23/2019 17:55,female,1,1976, -1.1945,0.928,1.3455,1.228125,1644,10/23/2019 18:42,male,1,1967, -2.181,1.672,1.56766667,2.0845,1645,10/26/2019 15:59,female,1,1973, -2.539,3.645,1.49,3.54166667,1646,10/26/2019 17:39,male,1,1957, -1.01714286,0.988,1.3165,1.469,1647,10/23/2019 18:16,male,1,1974, -0.63177778,0.58561538,0.61358333,0.57406667,1648,10/23/2019 18:25,male,1,1975, -1.058,1.6944,1.003,1.15671429,1649,10/23/2019 18:44,male,1,1979, -1.07111111,1.10325,0.863875,1.24583333,1650,10/23/2019 18:51,female,1,1988, -0.67177778,0.58508333,0.83091667,0.6621,1651,10/23/2019 18:57,male,1,1988, -0.89990909,0.99125,0.69683333,0.68081818,1652,10/23/2019 19:03,female,1,1974, -1.58785714,1.78033333,1.7875,1.96,1653,10/23/2019 19:11,male,1,1958, -1.01725,1.06785714,0.9165,0.94433333,1654,10/23/2019 19:16,female,1,1967, -0.6472,0.61646154,0.60873333,0.66988889,1655,10/23/2019 19:19,male,1,1967, -0.579,0.522875,0.51538462,0.58077778,1656,10/23/2019 19:23,male,1,1977, -0.977375,0.937625,1.13483333,0.877875,1657,10/23/2019 20:06,female,1,1969, -5.469,1.655,2.2196,1.94325,1658,10/23/2019 20:05,male,1,1987, -0.595875,0.836625,0.8491,0.76115385,1660,10/23/2019 20:16,male,1,1982, -2.6595,1.6655,2.424,2.20975,1662,10/23/2019 20:30,female,1,1956, -1.35133333,1.53733333,1.591,1.8166,1665,10/23/2019 20:53,male,1,1953, -0.53123077,0.69441667,0.83683333,0.65678571,1666,10/23/2019 22:20,female,1,1989, -0.703,0.963,0.74542857,0.64666667,1669,10/23/2019 21:38,male,1,2000, -1.33222222,1.34766667,1.23733333,1.33216667,1672,10/23/2019 21:55,male,1,1950, -0.83433333,1,0.859,1.05788889,1673,10/24/2019 17:13,male,1,1972, -0.71227273,0.805,1.2974,1.14527273,1675,10/24/2019 17:24,female,1,1979, -0.897,0.89977778,1.46283333,0.868375,1676,10/25/2019 12:26,female,1,1999, -1.09611111,1.2985,1.437,1.4256,1679,10/25/2019 16:01,female,1,1981, -3.726,1.54666667,1.4285,2.624,1680,10/25/2019 20:45,male,1,1976, -1.3974,1.828,1.504,1.45866667,1680,10/26/2019 11:15,male,1,1976, -0.8149,1.14228571,0.89414286,0.941875,1680,10/26/2019 11:17,male,1,1976, -0.48633333,0.55142857,0.63185714,0.49023529,1681,10/25/2019 17:19,male,1,1985, -1.2514,1.106,1.2525,1.24714286,1682,10/25/2019 17:35,male,1,1958, -1.17375,1.2255,1.01833333,0.86688889,1682,10/25/2019 17:49,male,1,1958, -1.86833333,1.678,1.555,2.538,1684,10/25/2019 21:46,male,1,1954, -0.853,0.55753846,0.707375,0.67036364,1685,10/25/2019 22:04,male,1,1987, -0.698875,0.67857143,0.679,0.84718182,1686,10/25/2019 22:23,male,1,1976, -0.616125,1.18144444,0.94616667,0.69183333,1687,10/26/2019 11:57,female,1,1988, -0.80171429,0.6941,0.97742857,0.74692308,1687,10/26/2019 11:58,female,1,1988, -1.0282,0.73385714,1.0423,1.17757143,1688,10/26/2019 12:05,male,1,1971, -0.927,0.8598,1.13875,0.83285714,1688,10/26/2019 12:06,male,1,1971, -1.14925,0.8908,2.3005,1.239,1688,10/26/2019 12:03,male,1,1971, -0.68244444,0.6306,0.646,0.657,1689,10/26/2019 12:47,male,1,1997, -2.011,1.99533333,1.69,1.506,1690,10/26/2019 15:20,male,1,1960, -0.869,0.6126,0.7001,0.7091,1691,10/26/2019 15:26,male,1,1965, -1.333,1.8995,1.40883333,1.67433333,1692,10/26/2019 15:36,male,1,1952, -1.14433333,1.143,1.187,1.095125,1693,10/26/2019 19:33,male,1,1968, -1.1978,1.25666667,1.40728571,1.278875,1694,10/26/2019 18:51,female,1,1978, -1.3398,1.20771429,0.999,1.08475,1695,10/26/2019 19:03,male,1,1988, -1.2904,1.0184,1.02509091,0.99471429,1695,10/26/2019 19:03,male,1,1988, -0.679,0.9056,1.54533333,0.82066667,1696,10/26/2019 20:08,male,1,1983, -1.124375,1.35666667,1.52466667,1.2185,1697,10/26/2019 19:44,female,1,1987, -2.6726,1.5525,2.678,1.668,1698,10/26/2019 21:45,female,1,1980, -0.8932,1.41,1.14575,1.06855556,1698,10/26/2019 21:48,female,1,1980, -2.6726,1.5525,2.678,1.668,1698,10/26/2019 21:45,female,1,1980, -2.0346,1.6405,2.24116667,1.105,1698,10/26/2019 21:46,female,1,1980, -1.95225,1.966,1.618,1.2994,1698,10/26/2019 21:47,female,1,1980, -2.67425,2.49,1.8715,1.8582,1699,10/27/2019 10:28,female,1,1980, -0.75309091,0.72871429,0.7276,0.816875,1700,10/27/2019 11:21,male,1,1975, -1.14525,1.2985,1.184,1.3395,1701,10/27/2019 11:41,female,1,1982, -0.91766667,0.66088889,0.9986,0.93133333,1703,10/27/2019 12:55,female,1,2000, -3.115,3.25766667,2.8645,4.1,1704,10/27/2019 13:05,female,0,1963, -1.08711111,0.84983333,1.03771429,0.7074,1705,10/27/2019 13:08,female,1,1974, -0.50558824,0.51666667,0.64633333,0.6470625,1706,10/27/2019 13:23,male,1,2012, -2.512,2.88616667,1.936,1.592,1707,10/27/2019 13:51,male,1,1950, -1.21533333,0.87,1.40128571,1.1132,1708,10/27/2019 14:34,female,1,1948, -1.01044444,1.24375,1.01075,1.13433333,1709,10/27/2019 16:18,female,1,1975, -0.851,1.038875,1.238375,0.9698,1711,10/27/2019 17:28,female,1,1981, -0.847625,1.032875,0.873,0.8767,1712,10/27/2019 17:35,female,1,1987, -0.54275,0.58969231,0.74233333,0.68133333,1713,10/27/2019 17:51,male,1,1983, -0.68575,0.81666667,0.95666667,0.69442857,1714,10/27/2019 17:57,male,1,1984, -1.398,1.33125,1.145,1.42633333,1715,10/27/2019 18:02,male,1,1969, -2.76325,3.615,3.7565,3.5155,1716,10/27/2019 18:21,female,1,1948, -0.75892308,0.790625,0.811,0.60055556,1717,10/27/2019 18:24,male,1,1976, -0.7051,0.9834,0.82925,0.86766667,1718,10/27/2019 18:52,female,1,1958, -1.15171429,1.11766667,0.8895,1.00742857,1720,10/27/2019 19:20,female,1,1964, -1.17775,1.4427,1.2192,1.31166667,1721,10/27/2019 20:50,male,1,1974, -2.0115,1.2855,1.775,1.508,1721,10/27/2019 20:51,male,1,1974, -1.96233333,2.39733333,2.3375,2.255,1723,10/29/2019 15:56,male,1,1968, -1.967,1.9112,1.352,2.015,1724,10/27/2019 20:22,male,1,1980, -1.18457143,1.77,1.42533333,1.01671429,1725,10/27/2019 21:07,female,1,1987, -0.6826,0.593,0.82377778,0.63033333,1726,11/6/2019 8:44,female,1,2000,3 -1.0505,0.507875,0.553,0.68066667,1726,11/10/2019 16:32,female,1,2000,3 -1.557,0.935,1.57325,1.4694,1726,10/27/2019 20:53,female,1,2000,3 -0.72625,0.51525,0.63266667,0.5204,1726,11/7/2019 8:39,female,1,2000,3 -0.608875,0.6575,0.7685,0.56206667,1726,11/10/2019 20:37,female,1,2000,3 -1.20183333,0.967,0.9907,1.49725,1726,10/27/2019 20:54,female,1,2000,3 -0.744,0.616375,0.5485,0.59845455,1726,11/8/2019 8:10,female,1,2000,3 -0.68,0.561,0.9478,0.626875,1726,12/16/2019 21:53,female,1,2000,3 -0.76772727,0.607,0.67081818,0.77354545,1726,11/6/2019 8:35,female,1,2000,3 -0.55454545,0.65985714,0.63625,0.5542,1726,11/10/2019 16:04,female,1,2000,3 -1.36457143,1.45975,1.517,1.0904,1727,10/29/2019 14:44,male,1,1998, -1.38985714,1.0275,1.33071429,0.98233333,1727,10/29/2019 14:45,male,1,1998, -1.143125,1.26566667,1.709,1.099,1727,10/29/2019 14:46,male,1,1998, -1.71633333,0.74285714,1.40733333,1.34633333,1727,10/29/2019 14:43,male,1,1998, -1.42088889,1.03375,1.5922,0.9706,1727,10/29/2019 14:47,male,1,1998, -0.87514286,1.07133333,0.9562,1.85625,1728,10/28/2019 16:10,male,1,2000, -1.25916667,1.72166667,1.6898,1.518,1729,10/28/2019 16:37,female,1,1982, -1.1734,1.2884,1.06857143,1.24525,1730,10/28/2019 17:24,male,1,1973, -1.54414286,2.47466667,0.628,1.643,1731,10/28/2019 20:22,male,1,2002, -1.119,2.1655,0.898,1.22025,1732,10/28/2019 18:36,male,1,1968, -1.25171429,1.0245,0.82657143,0.873,1733,10/28/2019 19:50,male,1,2005, -0.83127273,0.9545,0.93925,0.79981818,1734,10/28/2019 20:01,female,1,1974, -0.7235,1.004,0.92814286,1.10442857,1736,10/28/2019 20:24,female,1,1986, -1.2436,1.3964,1.329,1.223625,1737,10/28/2019 22:00,female,1,1970, -1.47425,2.258,1.6006,2.55733333,1737,10/28/2019 20:53,female,1,1970, -1.3615,1.04166667,0.945,1.3425,1738,10/28/2019 20:34,male,1,1967, -1.1072,1.088,0.82155556,0.84777778,1739,10/28/2019 20:47,female,1,1984, -1.8922,1.0794,1.404,1.846,1740,10/28/2019 21:19,male,1,1988, -0.940625,1.37928571,1.04985714,1.2355,1741,10/28/2019 21:21,male,1,1988, -0.95788889,1.03383333,0.99316667,1.120375,1742,10/28/2019 21:47,female,0,1986, -1.37166667,1.71571429,1.9165,1.97,1743,10/28/2019 22:19,male,1,1965, -2.0052,2.489,1.93716667,2.898,1745,10/28/2019 22:38,female,1,1955, -0.8124,1.139,1.26233333,0.9545,1748,10/29/2019 18:21,male,1,1982, -0.85036364,0.66414286,0.79616667,0.625,1748,10/29/2019 18:22,male,1,1982, -0.49825,0.58766667,0.5444,0.704,1749,10/29/2019 18:46,male,1,1983, -0.57372727,0.52746154,0.51235294,0.5166,1750,10/29/2019 18:55,male,1,1985, -0.55536842,0.66241667,0.78628571,0.792,1751,10/29/2019 19:04,female,1,1974, -0.66125,0.65588889,0.73035714,0.71518182,1752,10/29/2019 19:14,female,1,1980, -0.84166667,0.63315385,0.90257143,0.58564706,1752,10/29/2019 19:08,female,1,1980, -0.716625,0.5888,0.81742857,0.67214286,1752,10/29/2019 19:09,female,1,1980, -0.7815,0.6824,0.8716,0.672,1752,10/29/2019 19:13,female,1,1980, -0.59585714,0.595875,0.6731875,0.5803,1753,10/29/2019 19:34,male,1,1980, -0.85033333,0.81316667,1.13916667,0.80869231,1754,10/29/2019 19:43,male,1,1973, -0.944,0.993,0.930125,1.04990909,1755,10/29/2019 19:47,male,1,1982, -1.23325,1.3814,1.25825,1.22916667,1756,10/29/2019 20:01,male,1,1961, -0.913,1.142,1.5422,1.37277778,1757,10/29/2019 20:13,female,1,1974, -2.2118,2.119,2.808,2.48,1758,10/29/2019 20:14,male,1,1955, -1.61755556,2.637,1.32825,1.4624,1759,10/29/2019 21:20,male,1,1967, -2.91733333,2.03733333,2.77166667,2.24066667,1760,10/29/2019 21:41,female,1,1951, -0.83875,1.12066667,0.7592,1.1465,1761,10/29/2019 22:01,male,1,1989, -1.85925,1.5205,1.42033333,1.859,1762,10/29/2019 22:21,female,1,1975, -2.0475,1.9905,1.4626,1.668,1763,10/29/2019 22:37,male,1,1971, -0.995,1.25616667,1.41914286,1.356,1764,10/29/2019 22:57,male,1,1949, -0.83041667,0.836,0.72775,0.61123077,1766,10/30/2019 18:30,male,1,1982, -1.31033333,1.6465,1.85683333,1.8955,1767,10/30/2019 19:21,female,1,1967, -0.9235,1.277,0.96171429,1.272,1768,10/30/2019 19:36,female,1,1985, -0.887,0.81533333,0.56533333,1.679,1769,10/30/2019 19:55,male,1,1975, -0.84085714,0.83533333,0.78685714,0.895,1769,10/30/2019 19:56,male,1,1975, -1.7155,1.4795,1.344,1.335,1771,10/30/2019 22:11,male,1,1967, -0.92,1.20175,1.286,0.943,1772,10/30/2019 22:32,female,1,1971, -0.77963636,0.93875,0.66133333,0.97,1774,10/31/2019 15:46,female,1,2000, -1.32116667,1.2582,1.5635,1.47916667,1775,10/31/2019 17:34,male,1,1965, -0.7146,0.6538,0.818,0.61025,1776,10/31/2019 17:59,female,1,1980, -0.5042,0.6506875,0.47863636,0.56745455,1777,10/31/2019 18:02,female,0,1985, -0.50415,0.60253846,0.56045455,0.5732,1778,10/31/2019 18:23,male,1,1975, -2.49775,1.6815,2.429,2.4115,1779,10/31/2019 18:37,male,1,1948, -0.87754545,0.80625,0.7683,0.8833,1780,10/31/2019 18:41,male,1,1989, -1.08828571,1.14014286,1.25766667,1.6465,1782,10/31/2019 19:25,male,1,1960, -0.889,0.8136,1.2412,1.160125,1783,10/31/2019 19:40,female,1,1969, -1.66366667,1.87683333,1.33333333,1.52216667,1784,10/31/2019 22:04,male,1,1944, -0.7116,0.85418182,0.94814286,1.01166667,1786,11/1/2019 3:24,female,1,1992, -1.83,0.80233333,0.686,0.91711111,1789,11/1/2019 21:12,male,1,1982, -1.772625,0.81225,0.95416667,0.80775,1790,11/2/2019 12:15,male,1,2002, -0.60461538,0.58957143,0.745375,0.57184615,1792,11/7/2019 7:38,male,1,2000,2 -1.12714286,1.013375,1.053,1.18057143,1792,12/16/2019 17:50,male,1,2000,2 -1.1405,1.26,0.957625,0.8278,1792,11/4/2019 7:26,male,1,2000,2 -0.75045455,0.78433333,0.85736364,0.74442857,1792,11/7/2019 16:31,male,1,2000,2 -0.9598,0.74944444,0.71644444,1.14516667,1792,11/5/2019 5:26,male,1,2000,2 -0.9474,1.1534,0.77866667,0.83466667,1792,11/7/2019 16:57,male,1,2000,2 -0.920375,0.740125,0.80961538,0.78628571,1792,11/6/2019 7:30,male,1,2000,2 -1.43728571,1.195,1.07033333,1.33066667,1792,11/7/2019 17:11,male,1,2000,2 -0.61415385,0.581,0.63955556,0.65569231,1793,11/3/2019 13:13,male,1,2000, -1.37333333,1.47775,1.68842857,1.5612,1794,11/3/2019 14:57,male,1,1981, -1.1412,1.02185714,1.2068,1.19722222,1795,11/3/2019 15:39,male,1,1970, -1.84533333,1.5116,2.20075,2.258,1796,11/3/2019 15:57,male,1,1954, -0.8222,0.74811111,0.60388235,1.139,1797,11/3/2019 16:04,male,1,1975, -0.68966667,0.49457143,0.5585,0.9215,1798,11/8/2019 7:39,male,1,2000,3 -0.571,0.78933333,0.687,0.837,1798,11/9/2019 7:08,male,1,2000,3 -0.753,0.581,0.6925,0.927,1798,11/6/2019 7:28,male,1,2000,3 -0.59358824,0.76716667,0.67033333,0.76677778,1798,11/10/2019 10:55,male,1,2000,3 -0.72690909,0.76855556,0.7255,0.778625,1798,11/7/2019 7:32,male,1,2000,3 -0.6675,0.60933333,0.568,0.8445,1798,12/16/2019 19:39,male,1,2000,3 -0.49235,0.51525,0.553125,0.56375,1799,11/3/2019 23:15,male,1,2000, -0.59726667,0.687,0.77666667,0.7783,1799,11/10/2019 12:32,male,1,2000, -0.71106667,0.57876923,0.72275,0.76990909,1800,11/6/2019 13:29,male,1,1995, -0.57927273,0.50635714,0.52705882,0.54238462,1800,11/10/2019 16:07,male,1,1995, -0.65355556,0.56745455,0.6575,0.78311111,1800,11/7/2019 14:19,male,1,1995, -0.9155,1.3585,0.764,1.27155556,1800,11/4/2019 13:41,male,1,1995, -0.6637,0.56133333,0.69338462,0.61122222,1800,11/8/2019 10:36,male,1,1995, -0.69675,0.65716667,0.7235,0.78,1800,11/5/2019 15:00,male,1,1995, -0.5561875,0.514625,0.62836364,0.63853846,1800,11/9/2019 15:46,male,1,1995, -0.61727273,0.65653846,0.71,0.51727273,1801,11/8/2019 8:37,female,1,2000, -0.70254545,0.78425,0.808875,0.731,1801,11/4/2019 8:22,female,1,2000, -0.611625,0.62122222,0.60905556,0.5755,1801,11/9/2019 8:05,female,1,2000, -0.94155556,0.75390909,0.7784,0.58288889,1801,11/6/2019 8:27,female,1,2000, -0.6659,0.56614286,0.576625,0.65533333,1801,11/10/2019 18:53,female,1,2000, -0.88625,0.584,1.009,1.0626,1801,11/7/2019 8:20,female,1,2000, -0.77188889,0.56258333,0.815,0.54916667,1802,11/10/2019 10:40,female,1,2000, -0.64233333,0.621,1.115,0.773,1802,11/5/2019 10:20,female,1,2000, -1.0918,0.62842857,0.69822222,0.726125,1802,11/5/2019 10:24,female,1,2000, -0.721,0.562,0.57475,0.64690909,1802,11/8/2019 11:22,female,1,2000, -0.72942857,0.74866667,0.574,1.05433333,1802,11/6/2019 11:04,female,1,2000, -0.7432,0.7325,0.69033333,0.74754545,1802,11/9/2019 10:30,female,1,2000, -0.68236364,0.59353333,0.67675,0.8374,1802,11/7/2019 15:48,female,1,2000, -0.77071429,0.909,1.05455556,1.09,1802,11/4/2019 7:38,female,1,2000, -0.79177778,0.94633333,0.789,1.01871429,1803,11/7/2019 10:51,male,1,2000, -1.1108,1.0712,1.36655556,1.6695,1803,11/4/2019 7:03,male,1,2000, -1.013125,0.74688889,0.8783,0.969,1803,11/8/2019 7:55,male,1,2000, -0.99255556,0.758,0.77942857,1.1285,1803,11/5/2019 9:59,male,1,2000, -1.11271429,1.039125,1.4904,1.2242,1803,11/9/2019 22:53,male,1,2000, -0.83466667,0.8201,0.902,0.91,1803,11/6/2019 8:31,male,1,2000, -0.890625,1.00671429,1.19433333,1.20828571,1803,11/10/2019 6:45,male,1,2000, -0.97,0.96666667,0.72054545,1.00157143,1804,11/4/2019 7:10,male,1,2000, -0.71555556,0.86166667,0.6315,0.96111111,1804,11/8/2019 17:04,male,1,2000, -0.6124,0.71083333,0.75422222,0.69658333,1804,11/5/2019 7:12,male,1,2000, -0.60485714,0.806375,0.67138462,0.78314286,1804,11/9/2019 7:10,male,1,2000, -0.60708333,0.949,0.68376923,0.72190909,1804,11/6/2019 7:13,male,1,2000, -0.57735714,0.62607692,0.6742,0.60490909,1804,11/10/2019 7:16,male,1,2000, -0.567875,0.67841667,0.6476875,0.6862,1804,11/7/2019 7:10,male,1,2000, -0.7427,0.61577778,0.59207692,0.62378571,1805,11/5/2019 7:57,male,1,2000,3 -0.59528571,0.47417647,0.57221429,0.578,1805,11/9/2019 8:06,male,1,2000,3 -0.554,0.64,0.6935,0.54633333,1805,11/6/2019 8:46,male,1,2000,3 -0.55015385,0.533,0.58481818,0.62615385,1805,11/11/2019 10:25,male,1,2000,3 -0.67288889,0.574,0.62629412,0.69046154,1805,11/7/2019 7:44,male,1,2000,3 -0.71041667,0.62841667,0.6628,0.56141667,1805,11/8/2019 7:59,male,1,2000,3 -0.7208,0.538,0.60733333,0.709,1805,11/4/2019 8:03,male,1,2000,3 -0.5942,0.63023077,0.75166667,0.60373333,1806,11/6/2019 7:33,female,1,2001,4 -0.54592308,0.59342857,0.61157895,0.51938462,1806,11/9/2019 10:54,female,1,2001,4 -0.65890909,0.59723077,0.806875,0.665,1806,11/7/2019 9:28,female,1,2001,4 -0.6703,0.61075,0.6722,0.48054545,1806,11/10/2019 11:15,female,1,2001,4 -0.72458333,0.673125,0.78225,0.6834,1806,11/4/2019 7:51,female,1,2001,4 -0.69025,0.68771429,0.79233333,0.623,1806,11/7/2019 9:29,female,1,2001,4 -0.6508,0.6814,0.793,0.55526667,1806,11/5/2019 9:59,female,1,2001,4 -0.69466667,0.57230769,0.62258333,0.5885,1806,11/8/2019 9:26,female,1,2001,4 -0.52325,0.7674,0.59385714,0.580125,1807,11/6/2019 7:36,male,1,2000, -0.62925,0.68933333,0.6185625,0.60309091,1807,11/10/2019 10:21,male,1,2000, -0.72614286,0.77008333,0.63053846,0.55023077,1807,11/7/2019 8:23,male,1,2000, -0.69209091,0.88325,0.724,0.58045455,1807,11/4/2019 7:55,male,1,2000, -0.50123077,0.63738462,0.7625,0.67281818,1807,11/8/2019 9:59,male,1,2000, -0.57123529,0.71781818,0.57784615,0.62328571,1807,11/5/2019 7:37,male,1,2000, -0.536,0.83933333,0.569875,0.53185714,1807,11/9/2019 11:32,male,1,2000, -0.68075,0.69272727,0.6238,0.65,1808,11/7/2019 7:31,male,1,2000, -1.08183333,0.89454545,0.7947,0.659625,1808,11/4/2019 7:55,male,1,2000, -0.67709091,0.674,0.681,0.615,1808,11/8/2019 10:37,male,1,2000, -0.96633333,0.9112,1.421,0.858375,1808,11/5/2019 7:41,male,1,2000, -1.04416667,0.67145455,0.82536364,0.6641,1808,11/9/2019 18:04,male,1,2000, -0.686,0.873,0.80957143,0.5935,1808,11/6/2019 7:31,male,1,2000, -0.682375,0.7721,0.64266667,0.76881818,1808,11/10/2019 9:24,male,1,2000, -0.92014286,0.792,0.94355556,1.1028,1809,11/4/2019 8:08,female,1,2000, -0.9736,0.73625,0.84433333,0.69816667,1809,11/8/2019 7:45,female,1,2000, -0.96883333,0.78777778,1.209,0.85714286,1809,11/5/2019 10:42,female,1,2000, -0.89954545,0.73118182,0.957,1.117375,1809,11/6/2019 7:24,female,1,2000, -1.18083333,0.82309091,1.029625,0.77214286,1809,11/7/2019 18:28,female,1,2000, -0.9232,0.83116667,0.75709091,0.80935714,1810,11/4/2019 8:16,male,1,2001, -0.99566667,0.683,0.65983333,0.6825,1810,11/5/2019 10:07,male,1,2001, -0.574,0.55006667,0.6976,0.6555,1811,11/5/2019 7:17,male,1,2001, -0.592,0.56453333,0.65185714,0.553,1811,11/9/2019 7:19,male,1,2001, -0.56181818,0.70944444,0.72,0.589,1811,11/6/2019 7:02,male,1,2001, -0.569,0.60026667,0.5958,0.57541667,1811,11/10/2019 11:08,male,1,2001, -0.55566667,0.745,0.69,0.71338462,1811,11/7/2019 7:32,male,1,2001, -0.49886667,0.57723077,0.5684375,0.52836364,1811,12/16/2019 17:54,male,1,2001, -0.72733333,0.73377778,0.66942857,0.7268,1811,11/4/2019 8:27,male,1,2001, -0.6951,0.81263636,0.67744444,0.72527273,1811,11/8/2019 7:19,male,1,2001, -0.5655,0.61215385,0.74442857,0.665,1812,11/5/2019 8:07,female,1,2001, -0.50805882,0.69275,0.64175,0.57022222,1812,11/9/2019 8:55,female,1,2001, -0.62073333,0.62875,0.60527273,0.57636364,1812,11/10/2019 9:56,female,1,2001, -0.61822222,0.5568,0.59666667,0.56553333,1812,11/6/2019 7:37,female,1,2001, -0.67122222,0.6391875,0.50576471,0.62775,1812,11/7/2019 8:25,female,1,2001, -0.57227778,0.65764706,0.6225,0.57683333,1812,11/4/2019 8:39,female,1,2001, -0.60658333,0.6683,0.6147,0.65071429,1812,11/8/2019 8:46,female,1,2001, -0.71166667,0.717,0.81833333,0.63,1813,11/4/2019 9:13,female,1,2000, -0.58721429,0.79344444,0.76366667,0.70181818,1813,11/5/2019 11:40,female,1,2000, -0.6854,0.7564,0.92666667,0.64918182,1814,11/4/2019 9:12,female,1,2000, -0.735,0.71981818,0.6585,0.52623077,1814,11/5/2019 11:07,female,1,2000, -0.88088889,0.5369,0.614,0.61863636,1814,11/5/2019 11:08,female,1,2000, -0.59233333,0.9435,0.71733333,0.746,1816,11/6/2019 8:34,male,1,2000, -0.5755,0.6315,0.635,0.52975,1816,11/7/2019 8:36,male,1,2000, -0.63488889,0.61909091,0.71125,0.566125,1816,11/9/2019 7:49,male,1,2000, -0.573,0.834,0.724,0.91,1816,11/4/2019 10:21,male,1,2000, -0.76238462,0.69590909,0.6865,0.752,1816,11/10/2019 13:49,male,1,2000, -0.7325,0.61411111,0.771,0.523,1817,11/4/2019 10:36,male,1,2000,3 -0.65254545,0.53615,0.688875,0.8,1817,11/8/2019 8:36,male,1,2000,3 -0.66018182,0.92428571,0.60815385,0.91155556,1817,11/5/2019 8:03,male,1,2000,3 -0.57282353,0.6355,0.867875,0.863875,1817,11/9/2019 7:47,male,1,2000,3 -0.667375,0.60983333,0.7701,0.73561538,1817,11/6/2019 8:40,male,1,2000,3 -0.53933333,0.53207692,0.63007692,0.7180625,1817,11/10/2019 21:14,male,1,2000,3 -0.64335714,0.59838462,0.7767,0.59155556,1817,11/7/2019 8:38,male,1,2000,3 -0.5209,0.5223,0.59516667,0.46566667,1818,11/5/2019 8:21,male,1,2000, -0.531,0.524375,0.54594444,0.5304,1818,11/9/2019 8:22,male,1,2000, -0.65561538,0.51221429,0.58675,0.54494118,1818,11/6/2019 10:49,male,1,2000, -0.48742857,0.45492857,0.501,0.555,1818,11/10/2019 17:44,male,1,2000, -0.54526667,0.5807,0.4966875,0.5009375,1818,11/7/2019 10:20,male,1,2000, -0.57505882,0.52466667,0.64108333,0.59211111,1818,11/4/2019 10:50,male,1,2000, -0.50890476,0.52807143,0.60327273,0.602875,1818,11/8/2019 8:55,male,1,2000, -0.98888889,0.77372727,0.97728571,0.891,1819,11/4/2019 12:07,female,1,2001, -0.64133333,0.55327273,0.6763,0.56755556,1820,11/6/2019 12:09,female,1,2000,3 -1.141,0.7835,0.87666667,0.821,1820,11/10/2019 12:48,female,1,2000,3 -0.586,0.676875,0.6045,0.53383333,1820,11/6/2019 12:16,female,1,2000,3 -0.64692857,0.6547,0.623,0.5609,1820,11/7/2019 16:26,female,1,2000,3 -0.61825,0.71666667,0.5488,0.5406,1820,11/6/2019 12:08,female,1,2000,3 -0.71022222,0.7165,0.781625,0.63477778,1820,11/8/2019 14:59,female,1,2000,3 -0.70266667,0.91785714,1.13828571,1.011,1821,11/7/2019 16:51,female,1,2000, -0.65930769,0.78914286,0.65516667,0.81122222,1821,11/10/2019 16:48,female,1,2000, -1.02566667,0.90771429,0.74777778,0.7055,1821,11/4/2019 15:10,female,1,2000, -0.77525,0.92433333,0.6515,0.708,1821,11/8/2019 16:33,female,1,2000, -0.81008333,0.9699,0.953125,0.76766667,1821,11/5/2019 14:41,female,1,2000, -0.77525,0.92433333,0.6515,0.708,1821,11/8/2019 16:33,female,1,2000, -0.75011111,0.85890909,0.79971429,0.8016,1821,11/6/2019 11:21,female,1,2000, -0.70773333,0.9004,0.52091667,0.7592,1821,11/10/2019 15:57,female,1,2000, -0.6444,0.6261875,0.669,0.6787,1822,11/8/2019 16:59,male,1,1999, -0.97555556,0.9698,0.720625,0.75021429,1822,11/4/2019 17:03,male,1,1999, -0.6975,0.5505625,0.919,0.52408333,1822,11/10/2019 14:26,male,1,1999, -0.73615385,0.68236364,0.837375,0.62966667,1822,11/6/2019 16:26,male,1,1999, -0.70071429,0.6607,0.9535,0.63811111,1822,11/10/2019 17:33,male,1,1999, -0.64792308,0.64263636,0.66416667,0.57363636,1822,11/7/2019 16:12,male,1,1999, -1.057,0.892375,1.12972727,0.83733333,1823,11/5/2019 22:20,female,1,2000, -0.7318,0.738875,0.897,1.104,1823,11/10/2019 18:25,female,1,2000, -0.70128571,0.703,0.93433333,0.68009091,1823,11/6/2019 13:41,female,1,2000, -0.7795,1.0472,0.85883333,1.155,1823,11/10/2019 18:58,female,1,2000, -0.883,1.15,0.92711111,0.82754545,1823,11/7/2019 16:35,female,1,2000, -0.78554545,0.6643,0.933,1.005875,1823,11/4/2019 17:35,female,1,2000, -0.73483333,0.68388889,0.98257143,1.16133333,1823,11/8/2019 9:09,female,1,2000, -0.89483333,0.66092857,0.72975,0.66264286,1824,11/4/2019 20:12,male,1,2000, -0.62608333,0.57181818,0.5226875,0.57530769,1824,11/4/2019 20:57,male,1,2000, -0.766,0.54164706,0.68455556,0.839375,1824,11/4/2019 20:22,male,1,2000, -0.7319,0.64471429,0.9675,0.9975,1824,11/4/2019 19:52,male,1,2000, -0.889625,0.56044444,0.735,0.84081818,1824,11/4/2019 20:34,male,1,2000, -0.68207143,0.53691667,0.7754,0.828,1824,11/4/2019 20:03,male,1,2000, -0.6709,0.57586667,0.70342857,0.5889375,1824,11/4/2019 20:45,male,1,2000, -0.63675,0.7686,1.05216667,1.247875,1825,11/4/2019 19:56,male,1,2000, -0.77125,0.76877778,0.953625,0.94011111,1825,11/8/2019 18:44,male,1,2000, -0.65891667,0.63957143,0.50166667,0.59390909,1826,11/5/2019 8:47,male,1,2000, -0.58390909,0.57207692,0.6465,0.50946154,1826,11/12/2019 0:36,male,1,2000, -0.6825,0.59536364,0.87333333,0.54983333,1826,11/7/2019 8:39,male,1,2000, -0.639,0.8345,0.75781818,0.653,1826,11/9/2019 8:27,male,1,2000, -0.55238462,0.6336,0.64166667,0.79436364,1826,11/4/2019 19:50,male,1,2000, -0.598125,0.59958333,0.63635294,0.48242857,1826,11/11/2019 3:02,male,1,2000, -0.509,0.65,0.51971429,0.55371429,1827,11/4/2019 19:51,male,1,2000, -0.563875,0.507,0.5309,0.53028571,1827,11/6/2019 1:08,male,1,2000, -0.704,0.586,0.79375,0.64709091,1827,11/7/2019 0:11,male,1,2000, -0.65557143,0.66472727,0.66436364,0.68875,1829,11/4/2019 20:11,male,1,2000, -0.70525,1.11966667,0.619,0.80884615,1830,11/11/2019 3:31,female,1,2000, -0.56166667,0.65728571,0.92781818,0.6492,1830,11/4/2019 20:44,female,1,2000, -0.78341667,0.788375,0.69854545,0.58745455,1830,11/11/2019 3:36,female,1,2000, -0.92685714,0.799,0.81075,0.55757143,1830,11/11/2019 2:44,female,1,2000, -0.58627273,0.74442857,0.54964286,0.59685714,1830,11/11/2019 3:42,female,1,2000, -0.726,1.066,0.645,0.61,1830,11/11/2019 3:26,female,1,2000, -0.5642,0.814,0.6715,0.47044444,1830,11/11/2019 3:53,female,1,2000, -1.271,0.5906,0.710375,0.608375,1831,11/4/2019 21:17,male,1,2000, -0.59873333,0.62146154,0.589,0.57046154,1832,11/7/2019 7:29,male,1,1997, -0.5488,0.51375,0.5078,0.56266667,1832,11/4/2019 21:33,male,1,1997, -0.70444444,0.5338125,0.6175,0.84061538,1832,11/8/2019 9:12,male,1,1997, -0.64690909,0.663,0.6454,0.7968,1832,11/5/2019 8:15,male,1,1997, -0.753,0.724,0.7588,0.976,1832,11/9/2019 7:25,male,1,1997, -0.6225,0.7195,0.589625,0.64084211,1832,11/6/2019 7:38,male,1,1997, -0.71555556,0.61557143,0.66635714,0.74976923,1832,11/10/2019 23:35,male,1,1997, -0.73928571,0.7678,0.82875,0.77875,1834,11/5/2019 18:53,female,1,2000, -0.588375,0.734,0.68876923,0.73307143,1834,11/5/2019 19:14,female,1,2000, -0.6354,0.76353846,0.719625,0.927,1835,11/7/2019 20:52,male,1,2000, -0.6864,0.67228571,0.76528571,0.881875,1835,11/8/2019 22:02,male,1,2000, -0.59433333,0.67908333,0.66207692,0.83855556,1835,11/4/2019 21:52,male,1,2000, -0.72990909,0.6628,0.853,0.80788889,1835,11/9/2019 18:05,male,1,2000, -0.51164706,0.77428571,0.56944444,0.60818182,1835,11/5/2019 18:12,male,1,2000, -0.671625,0.64241667,0.75272727,0.6965,1835,11/10/2019 19:49,male,1,2000, -0.93557143,1.0075,1.07625,0.96427273,1836,11/4/2019 22:00,female,1,2001, -0.724,0.80677778,0.8911,0.8332,1836,11/4/2019 22:00,female,1,2001, -0.75842857,0.829,0.8715,0.884625,1836,11/5/2019 18:01,female,1,2001, -0.67653846,0.82655556,0.691875,1.06071429,1836,11/6/2019 18:12,female,1,2001, -0.804,0.669,0.549625,0.55742857,1837,11/4/2019 22:08,male,1,2000, -0.54,0.46233333,0.48041176,0.51838889,1837,11/8/2019 19:53,male,1,2000, -0.56946154,0.55654545,0.51942857,0.58833333,1837,11/5/2019 9:01,male,1,2000, -0.54481818,0.57630769,0.49792857,0.46542105,1837,11/9/2019 21:46,male,1,2000, -0.5813,0.6738,0.66371429,0.57621429,1837,11/6/2019 7:09,male,1,2000, -0.57191667,0.51175,0.55442857,0.51276923,1837,11/10/2019 10:27,male,1,2000, -0.60053846,0.56646154,0.5365,0.64136364,1837,11/7/2019 7:40,male,1,2000, -0.53528571,0.50364286,0.53247059,0.88285714,1838,11/4/2019 22:16,male,1,2000, -0.57415385,0.52081818,0.63242857,0.56166667,1838,11/4/2019 22:15,male,1,2000, -0.677,0.68125,0.5996,0.62430769,1839,11/4/2019 22:45,male,1,2000, -0.8218,0.6974,0.7236,0.9795,1840,11/4/2019 22:50,male,1,2000, -0.95171429,0.79142857,0.857,0.97377778,1841,11/5/2019 18:27,female,1,2000, -0.74923077,0.79116667,0.72708333,0.95528571,1841,11/4/2019 23:01,female,1,2000, -0.6265,0.69033333,0.5678,1.3275,1842,11/4/2019 23:05,male,1,2000, -0.82075,0.66083333,0.91325,1.22,1843,11/6/2019 14:22,male,1,2000, -0.756,0.68225,0.78055556,0.92214286,1843,11/10/2019 17:10,male,1,2000, -0.91383333,0.72957143,0.8015,0.92992308,1843,11/8/2019 19:22,male,1,2000, -1.0235,0.76028571,0.85663636,1.1128,1843,11/4/2019 23:22,male,1,2000, -0.7696,0.67090909,0.83457143,0.8216,1843,11/8/2019 19:31,male,1,2000, -0.82111111,0.85955556,0.77715385,0.66585714,1843,11/6/2019 14:09,male,1,2000, -1.002,0.631,0.88716667,1.0403,1843,11/10/2019 17:00,male,1,2000, -0.57322222,0.5292,0.64571429,0.59142857,1844,11/8/2019 18:48,male,0,2001, -0.57266667,0.610125,0.63235714,0.61866667,1844,11/8/2019 23:46,male,0,2001, -0.5455,0.55911111,0.56975,0.7595,1844,11/4/2019 23:45,male,0,2001, -0.654,0.61715385,0.55053846,0.5843125,1844,11/11/2019 2:49,male,0,2001, -0.64811111,0.587625,0.62533333,0.59083333,1844,11/5/2019 23:38,male,0,2001, -0.57641667,0.509,0.5263,0.572,1844,11/11/2019 2:49,male,0,2001, -0.63542857,0.56853846,0.59657143,0.79041667,1844,11/8/2019 0:07,male,0,2001, -0.643,0.77345455,0.59492857,0.60625,1845,11/5/2019 0:16,female,1,2000, -0.52571429,0.59172727,0.51786667,0.64069231,1845,11/9/2019 11:58,female,1,2000, -0.62192857,0.6372,0.65578571,0.51427273,1845,11/6/2019 8:04,female,1,2000, -0.4825,0.5233,0.60271429,0.5934,1845,11/10/2019 12:48,female,1,2000, -0.49176471,0.67166667,0.68257143,0.51853333,1845,11/7/2019 20:05,female,1,2000, -0.5604,0.65806667,0.57176923,0.52130769,1845,11/8/2019 14:20,female,1,2000, -0.54346667,0.95157143,0.60535714,0.50961538,1846,11/6/2019 9:16,male,1,2000, -0.63125,0.645375,0.71928571,0.73669231,1846,11/10/2019 14:40,male,1,2000, -0.69511111,0.86781818,0.676,0.819375,1846,11/5/2019 0:26,male,1,2000, -0.6851,0.8421,0.65118182,0.848,1846,11/5/2019 7:44,male,1,2000, -0.86142857,0.8705,0.78416667,0.88688889,1847,11/6/2019 0:11,male,1,2000, -0.67571429,0.94475,0.6495625,0.71555556,1847,11/7/2019 0:41,male,1,2000, -0.535,0.56235714,0.60746667,0.68254545,1848,11/6/2019 10:53,male,1,2000, -0.54627273,0.70316667,0.6845,0.65633333,1849,11/8/2019 22:33,female,1,2000,2 -0.71211111,0.8035,0.497,0.8545,1849,11/5/2019 9:22,female,1,2000,2 -0.59422222,0.79854545,0.7825,0.6117,1849,11/9/2019 14:53,female,1,2000,2 -0.57653846,0.62314286,0.74966667,0.536375,1849,11/6/2019 8:21,female,1,2000,2 -0.7645,0.86218182,0.9946,0.8548,1849,11/10/2019 12:30,female,1,2000,2 -0.4742,0.65883333,0.666875,0.62877778,1849,11/7/2019 15:38,female,1,2000,2 -1.3945,0.94275,1.277,1.1838,1851,11/5/2019 10:36,female,1,2000, -1.04133333,0.74511111,0.8255,0.86666667,1851,11/10/2019 13:20,female,1,2000, -1.0312,0.88155556,0.97455556,1.379,1851,11/6/2019 21:52,female,1,2000, -0.817,0.74490909,0.5984,0.9107,1851,11/8/2019 10:24,female,1,2000, -0.94022222,0.7978,0.96857143,0.90471429,1851,11/5/2019 10:16,female,1,2000, -1.2325,1.0415,0.717625,1.16775,1851,11/9/2019 11:56,female,1,2000, -0.67022222,0.705,0.72116667,0.7515,1852,11/10/2019 12:33,female,1,2000, -0.795,0.81607692,0.686125,0.87658333,1852,11/5/2019 11:12,female,1,2000, -0.7291,0.80433333,0.71016667,0.892625,1852,11/10/2019 12:46,female,1,2000, -0.68325,0.7408,0.84455556,0.70976923,1852,11/5/2019 11:26,female,1,2000, -0.7735,0.75746154,0.813,0.72333333,1852,11/10/2019 12:56,female,1,2000, -0.76072727,0.86125,0.67955556,0.94166667,1852,11/10/2019 12:19,female,1,2000, -0.6099,0.79416667,0.75781818,0.77442857,1852,11/10/2019 13:16,female,1,2000, -1.112375,0.693625,0.81444444,1.01625,1853,11/5/2019 18:04,female,1,2000, -0.76218182,0.70542857,0.756625,0.69114286,1853,11/11/2019 11:31,female,1,2000, -0.715875,0.71778571,0.83275,0.7389,1853,11/8/2019 9:32,female,1,2000, -0.8592,0.77866667,0.83833333,0.67177778,1853,11/11/2019 11:48,female,1,2000, -1.2522,0.92733333,1.16166667,1.27042857,1853,11/8/2019 9:32,female,1,2000, -1.8375,1.05416667,1.22,0.816,1853,11/8/2019 9:33,female,1,2000, -1.34685714,0.73711111,0.68133333,0.686375,1854,11/7/2019 14:56,male,1,2000, -0.82666667,0.73757143,0.6346,0.75554545,1854,11/8/2019 17:46,male,1,2000, -0.88077778,0.74366667,0.93785714,0.71111111,1854,11/9/2019 11:55,male,1,2000, -0.87675,0.711,0.77985714,0.703125,1854,11/5/2019 20:05,male,1,2000, -0.74925,0.73033333,0.749,0.78308333,1854,11/6/2019 22:51,male,1,2000, -0.60564286,0.64738462,0.60690909,0.91414286,1854,11/10/2019 12:21,male,1,2000, -2.5615,1.47433333,1.239,2.322,1855,11/5/2019 20:21,female,1,2000, -2.01933333,1.8185,1.203,1.3082,1855,11/10/2019 10:52,female,1,2000, -1.377,1.025,1.3418,1.441,1855,11/7/2019 18:20,female,1,2000, -1.07033333,1.19666667,1.283875,1.02533333,1855,11/10/2019 10:53,female,1,2000, -1.37966667,0.94975,0.9545,1.13725,1855,11/10/2019 10:38,female,1,2000, -1.1995,1.15,1.01928571,1.2124,1855,11/10/2019 10:55,female,1,2000, -1.051,1.24025,1.21,1.3295,1855,11/10/2019 10:50,female,1,2000, -0.96125,0.644,0.764,0.808125,1856,11/6/2019 10:23,male,1,2000, -0.7179,1.49475,0.65116667,0.8785,1856,11/10/2019 13:52,male,1,2000, -0.835625,0.76892857,0.79514286,0.935,1856,11/7/2019 8:28,male,1,2000, -0.93,1.27088889,1.03366667,0.88645455,1856,11/10/2019 13:54,male,1,2000, -0.79263636,0.85366667,0.7237,0.88342857,1856,11/10/2019 12:34,male,1,2000, -0.92466667,1.0081,0.80075,1.12533333,1856,11/10/2019 13:56,male,1,2000, -1.24216667,0.8516,0.7812,2.08575,1856,11/5/2019 22:22,male,1,2000, -0.76871429,0.75725,0.80054545,1.06644444,1856,11/10/2019 12:55,male,1,2000, -2.392,1.4165,3.212,1.1105,1857,11/5/2019 23:13,male,1,1998, -0.567,0.54685714,0.53176923,0.57263636,1859,11/6/2019 8:20,male,1,2000, -0.622625,0.68733333,0.73342857,0.75016667,1859,11/10/2019 13:28,male,1,2000, -0.56285714,0.60569231,0.93672727,0.7136,1860,11/6/2019 13:28,male,0,2000, -0.74016667,0.55333333,0.986,0.72375,1860,11/6/2019 9:07,male,0,2000, -1.01533333,0.5435,1.605,0.573,1860,11/6/2019 13:27,male,0,2000, -0.63255556,0.73016667,0.60430769,0.65372727,1861,11/10/2019 13:37,male,1,2000, -0.56246154,0.6623,0.62407692,0.64916667,1861,11/6/2019 10:20,male,1,2000, -0.5759,0.725,0.60316667,0.655375,1861,11/10/2019 13:38,male,1,2000, -0.5964,0.636,0.825,0.596,1861,11/7/2019 8:34,male,1,2000, -0.59858333,0.6602,0.55605882,0.538,1861,11/8/2019 12:48,male,1,2000, -0.58475,0.5565,0.55733333,0.586,1863,11/6/2019 13:53,male,1,1995, -0.677,0.686,0.85057143,0.61,1863,11/10/2019 16:40,male,1,1995, -0.79341667,0.76875,0.80476923,0.82625,1863,11/10/2019 16:05,male,1,1995, -1.20383333,1.332,0.8721,1.03457143,1863,11/6/2019 12:44,male,1,1995, -0.7085,0.6455,0.80176923,1.009625,1863,11/10/2019 16:17,male,1,1995, -0.72592308,0.7236,1.0345,0.94477778,1863,11/6/2019 13:03,male,1,1995, -0.74708333,0.6858,0.8365,0.7615,1863,11/10/2019 16:28,male,1,1995, -0.60881818,0.579,0.77645455,0.87471429,1865,11/9/2019 10:44,male,1,2000, -0.80690909,0.95266667,0.86114286,0.96116667,1865,11/6/2019 17:06,male,1,2000, -0.97325,0.64614286,0.68625,0.822,1865,11/9/2019 10:57,male,1,2000, -0.8742,0.6305,0.89266667,0.93111111,1865,11/7/2019 15:45,male,1,2000, -0.887625,0.57486667,0.7258,0.76288889,1865,11/11/2019 17:26,male,1,2000, -0.72655556,0.66673333,0.6125,0.70941667,1865,11/7/2019 23:08,male,1,2000, -0.64413333,0.6083,0.69657143,0.596,1865,11/11/2019 17:41,male,1,2000, -0.69791667,0.65130769,0.90044444,0.8315,1866,11/10/2019 22:59,female,1,2000, -0.77425,0.908,0.612,0.83366667,1866,11/6/2019 18:11,female,1,2000, -0.7315,0.63357143,0.75577778,0.82209091,1866,11/10/2019 23:00,female,1,2000, -0.87825,0.94442857,0.74314286,0.657,1866,11/10/2019 22:55,female,1,2000, -0.65933333,0.9414,0.88825,0.7434,1866,11/10/2019 23:01,female,1,2000, -0.7642,0.98942857,0.86271429,0.77327273,1866,11/10/2019 22:58,female,1,2000, -0.92785714,0.9017,1.105875,1.0252,1866,11/10/2019 22:59,female,1,2000, -0.49085714,0.46011765,0.49475,0.4504,1870,11/7/2019 8:19,male,1,2000, -0.9288,0.87571429,1.19766667,0.86457143,1887,11/9/2019 17:32,male,1,2001, -0.74475,0.55166667,0.6765,0.6255,1887,11/9/2019 17:36,male,1,2001, -0.67177778,0.6798,0.913625,0.65507143,1887,11/9/2019 17:33,male,1,2001, -0.5454,0.60966667,0.59306667,0.74771429,1887,11/9/2019 17:38,male,1,2001, -0.65733333,0.56427273,0.62272222,0.848,1887,11/9/2019 17:34,male,1,2001, -0.59085714,0.616125,0.60082353,0.625,1887,11/9/2019 17:40,male,1,2001, -0.66954545,0.61033333,0.6725,0.75627273,1887,11/9/2019 17:35,male,1,2001, -0.7075,0.65071429,0.61663636,0.64246667,1887,11/9/2019 17:47,male,1,2001, -1.51785714,1.207,1.37566667,1.13371429,1888,11/7/2019 17:35,female,1,1999, -0.65207143,0.79671429,0.6893,0.62425,1888,11/10/2019 15:14,female,1,1999, -0.96833333,1.451875,1.375,1.07088889,1888,11/7/2019 18:43,female,1,1999, -0.67688889,0.62385714,0.58083333,0.66071429,1888,11/10/2019 15:15,female,1,1999, -0.83392308,0.92,1.1614,0.8788,1888,11/7/2019 18:45,female,1,1999, -0.67181818,0.62,0.65486667,0.54292308,1888,11/10/2019 15:16,female,1,1999, -0.76257143,0.929,0.84177778,0.75744444,1888,11/10/2019 15:12,female,1,1999, -0.727,0.851,0.861,0.8246,1889,11/7/2019 15:25,female,1,2001, -0.6914,0.871,0.69592308,0.708,1889,11/10/2019 15:05,female,1,2001, -0.75118182,0.8762,0.81311111,0.847,1889,11/7/2019 15:38,female,1,2001, -0.77342857,0.7973,0.86911111,0.78845455,1889,11/10/2019 15:22,female,1,2001, -0.631375,0.82488889,0.7358,0.8275,1889,11/8/2019 22:10,female,1,2001, -0.72085714,0.74825,0.75858333,0.85175,1889,11/10/2019 21:04,female,1,2001, -0.8019,0.7831,0.78233333,0.9063,1889,11/7/2019 15:14,female,1,2001, -0.733,0.73544444,0.88228571,0.8313,1889,11/10/2019 14:56,female,1,2001, -0.53269231,0.504,0.51184615,0.50570588,1890,11/8/2019 7:47,male,1,2000, -0.7469,0.91855556,0.6776,0.66763636,1891,11/8/2019 11:14,female,1,2000, -0.6775,0.73108333,0.89136364,0.6922,1891,11/8/2019 13:00,female,1,2000, -0.67384615,0.86933333,0.648,0.49035714,1891,11/8/2019 11:29,female,1,2000, -0.60976923,1.07744444,0.726375,0.61266667,1891,11/8/2019 11:44,female,1,2000, -0.97183333,0.81735714,0.87328571,0.6027,1891,11/8/2019 12:58,female,1,2000, -0.909875,0.832,0.79792857,1.11085714,1892,11/9/2019 15:28,female,1,2000, -0.89091667,0.871,0.78633333,0.9061,1892,11/8/2019 16:03,female,1,2000, -1.01785714,0.92733333,0.95125,0.749,1892,11/10/2019 19:14,female,1,2000, -0.979,0.76246154,0.75511111,1.07,1892,11/8/2019 16:20,female,1,2000, -0.72571429,0.88345455,1.02225,0.95636364,1892,11/10/2019 19:38,female,1,2000, -0.956375,0.7473,0.8555,0.79022222,1892,11/8/2019 16:28,female,1,2000, -0.88888889,1.26428571,0.733625,1.3136,1892,11/10/2019 19:38,female,1,2000, -0.8536,0.84933333,0.75071429,0.918,1893,11/8/2019 16:58,male,1,2000, -0.886,0.8225,0.6839375,1.01616667,1894,11/8/2019 23:18,male,1,2000, -0.6368,0.84475,0.68966667,0.82657143,1895,11/9/2019 0:07,male,1,2000, -0.57244444,0.62638462,0.56942857,0.6696,1896,11/9/2019 14:25,female,1,1999, -0.68433333,0.79025,0.706,0.883,1896,11/9/2019 14:34,female,1,1999, -0.75833333,0.756875,0.7407,0.84575,1896,11/9/2019 14:27,female,1,1999, -0.54163158,0.53941667,0.4962,0.54566667,1896,11/9/2019 14:35,female,1,1999, -0.73416667,0.6005,0.68975,0.7394,1896,11/9/2019 14:28,female,1,1999, -0.96742857,0.77025,0.7676,0.9233,1896,11/9/2019 14:22,female,1,1999, -0.7702,0.68733333,0.86988889,0.619375,1896,11/9/2019 14:30,female,1,1999, -0.59333333,0.589,0.6088,0.636,1897,11/9/2019 15:37,male,1,2000, -0.651,0.65755556,0.59030769,0.64292857,1897,11/9/2019 16:33,male,1,2000, -0.6896,0.539375,0.61325,0.6689,1897,11/9/2019 16:28,male,1,2000, -0.5171,0.6042,0.70566667,0.84136364,1897,11/9/2019 16:34,male,1,2000, -0.6605,0.69715385,0.8045,0.69728571,1897,11/9/2019 15:29,male,1,2000, -0.70163636,0.6965,0.56458333,0.75214286,1897,11/9/2019 16:30,male,1,2000, -0.6272,0.656,0.70746667,0.56146154,1897,11/9/2019 15:35,male,1,2000, -0.70736364,0.57630769,0.565375,0.60755556,1897,11/9/2019 16:32,male,1,2000, -0.547125,0.50335714,0.57305882,0.5474375,1898,11/9/2019 21:11,male,1,2000, -0.56606667,0.52282353,0.56155556,0.52621429,1898,11/9/2019 21:53,male,1,2000, -0.51721429,0.53738462,0.58276923,0.52686667,1898,11/9/2019 21:12,male,1,2000, -0.64866667,0.61233333,0.545,0.572125,1898,11/9/2019 20:48,male,1,2000, -0.5465,0.48009091,0.51963158,0.59213333,1898,11/9/2019 21:14,male,1,2000, -0.556,0.58138462,0.5125,0.54966667,1898,11/9/2019 20:58,male,1,2000, -0.50145455,0.497375,0.554625,0.55753846,1898,11/9/2019 21:52,male,1,2000, -0.4555,0.54745455,0.5286,0.6439375,1899,11/9/2019 23:59,male,1,2000, -0.79633333,0.98711111,0.68525,0.876,1901,11/10/2019 11:02,male,1,2001, -0.24096552,0.34416667,0.21386364,0.15095238,1901,11/10/2019 11:09,male,1,2001, -0.34211111,0.607,0.33542105,0.24009091,1901,11/10/2019 11:04,male,1,2001, -0.64107692,0.795625,0.752,0.72658333,1901,11/10/2019 10:56,male,1,2001, -0.25727586,0.33509091,0.26878571,0.12971429,1901,11/10/2019 11:06,male,1,2001, -0.48909091,0.60929412,0.85766667,0.74233333,1901,11/10/2019 11:01,male,1,2001, -0.34415,0.40025,0.2686,0.159,1901,11/10/2019 11:07,male,1,2001, -0.6133,0.52841667,0.5928,0.64269231,1902,11/10/2019 11:14,male,1,2000, -0.52878571,0.62038462,0.695,0.64966667,1904,11/10/2019 15:24,male,1,2000, -0.76133333,1.00466667,0.99533333,0.58185714,1905,11/11/2019 0:25,female,1,2000, -0.479,1.03114286,0.45473684,0.4589375,1905,11/11/2019 0:31,female,1,2000, -0.65433333,0.9055,0.89333333,0.68691667,1905,11/11/2019 0:26,female,1,2000, -0.49461111,0.45395,0.23476471,0.40488889,1905,11/11/2019 0:32,female,1,2000, -0.738,0.7874,0.89914286,0.56958333,1905,11/11/2019 0:28,female,1,2000, -0.65991667,1.0728,0.684,0.49283333,1905,11/11/2019 0:29,female,1,2000, -0.908125,0.87933333,1.6698,1.2194,1905,11/11/2019 0:23,female,1,2000, -0.84933333,0.73655556,0.7865,0.8526,1906,11/10/2019 17:22,male,1,2000, -0.69707692,0.60146154,0.72725,0.6646,1906,11/10/2019 17:33,male,1,2000, -0.72255556,0.657625,0.59875,0.5645,1906,11/10/2019 17:25,male,1,2000, -0.73728571,0.811875,0.94925,0.668625,1906,11/10/2019 17:11,male,1,2000, -0.9348,1.0382,0.60692308,0.746,1906,11/10/2019 17:26,male,1,2000, -0.81569231,0.73685714,0.67125,0.721375,1906,11/10/2019 17:20,male,1,2000, -0.81814286,0.736,0.606,0.75985714,1906,11/10/2019 17:31,male,1,2000, -0.8155,0.74041667,0.7934,0.68523077,1908,11/10/2019 17:16,male,1,2000, -0.83311111,0.53155556,0.84933333,0.6018,1908,11/10/2019 17:36,male,1,2000, -0.6863,0.83966667,0.93875,0.51527273,1908,11/10/2019 17:49,male,1,2000, -0.66045455,0.8255,0.66627273,0.58766667,1909,11/10/2019 18:50,male,1,2000, -0.5748,0.58357143,0.67157143,0.83138462,1909,11/10/2019 18:55,male,1,2000, -0.5889,0.53221429,0.60658333,0.5594375,1909,11/10/2019 18:57,male,1,2000, -0.55877778,0.50353333,0.7618,0.68771429,1909,11/10/2019 18:59,male,1,2000, -0.59544444,0.63757143,0.8478,0.83078571,1909,11/10/2019 18:43,male,1,2000, -0.636625,0.60888235,0.76155556,0.68972727,1909,11/10/2019 18:47,male,1,2000, -0.66045455,0.8255,0.66627273,0.58766667,1909,11/10/2019 18:50,male,1,2000, -0.5748,0.58357143,0.67157143,0.83138462,1909,11/10/2019 18:55,male,1,2000, -0.5889,0.53221429,0.60658333,0.5594375,1909,11/10/2019 18:57,male,1,2000, -0.55877778,0.50353333,0.7618,0.68771429,1909,11/10/2019 18:59,male,1,2000, -0.636625,0.60888235,0.76155556,0.68972727,1909,11/10/2019 18:47,male,1,2000, -0.66045455,0.8255,0.66627273,0.58766667,1909,11/10/2019 18:50,male,1,2000, -0.57192857,0.54736364,0.74388889,0.78228571,1909,11/10/2019 18:53,male,1,2000, -0.5748,0.58357143,0.67157143,0.83138462,1909,11/10/2019 18:55,male,1,2000, -0.5889,0.53221429,0.60658333,0.5594375,1909,11/10/2019 18:57,male,1,2000, -0.636625,0.60888235,0.76155556,0.68972727,1909,11/10/2019 18:47,male,1,2000, -0.57192857,0.54736364,0.74388889,0.78228571,1909,11/10/2019 18:53,male,1,2000, -0.5889,0.53221429,0.60658333,0.5594375,1909,11/10/2019 18:57,male,1,2000, -0.5889,0.53221429,0.60658333,0.5594375,1909,11/10/2019 18:57,male,1,2000, -0.636625,0.60888235,0.76155556,0.68972727,1909,11/10/2019 18:47,male,1,2000, -0.751,0.5488,0.853,0.636,1913,11/10/2019 19:32,male,1,2000, -0.56835714,0.49807143,0.63122222,0.9321,1913,11/10/2019 19:39,male,1,2000, -0.66644444,0.57666667,0.764,0.78354545,1913,11/10/2019 19:34,male,1,2000, -0.729375,0.61545455,0.827,0.9844,1913,11/10/2019 19:27,male,1,2000, -0.67307692,0.51238889,0.63488889,0.67577778,1913,11/10/2019 19:36,male,1,2000, -0.63030769,0.5573,0.81766667,0.73325,1913,11/10/2019 19:31,male,1,2000, -0.54833333,0.5055,0.67007692,0.58476923,1913,11/10/2019 19:38,male,1,2000, -0.48430769,0.52076923,0.53676471,0.54935714,1921,11/10/2019 19:39,male,1,2000, -0.987,1.14185714,0.890125,0.88863636,1922,11/10/2019 20:30,male,1,2000, -0.60342857,0.70066667,0.5888,0.87376923,1923,11/10/2019 20:43,male,1,2000, -0.645875,0.62625,0.63021429,0.961625,1924,11/10/2019 20:50,male,1,2000, -0.52166667,0.47409091,0.909,0.7696,1925,11/10/2019 20:56,male,1,2000, -0.598,0.70222222,0.67555556,0.893,1926,11/10/2019 21:02,male,1,2000, -0.76866667,1.07054545,0.69785714,0.90228571,1927,11/10/2019 22:50,male,1,2000, -0.68641667,0.664,0.6354,0.62146154,1927,11/10/2019 22:54,male,1,2000, -0.80972727,0.6095,0.65846667,0.65211111,1927,11/10/2019 22:51,male,1,2000, -0.55246154,0.63092857,0.5865,0.60053846,1927,11/10/2019 22:56,male,1,2000, -0.77614286,0.80666667,0.70472727,0.75293333,1927,11/10/2019 22:52,male,1,2000, -0.78672727,0.7291,0.66454545,0.90028571,1927,11/10/2019 22:43,male,1,2000, -0.7646,0.73236364,0.8149,0.67077778,1927,11/10/2019 22:53,male,1,2000, -0.89714286,1.237,0.91457143,0.80966667,1929,11/11/2019 0:28,female,1,2000, -0.5792,0.87792857,0.43817647,0.30278571,1929,11/11/2019 0:33,female,1,2000, -0.7894,0.96307692,0.82642857,0.7234,1929,11/11/2019 0:29,female,1,2000, -0.68916667,0.9235,1.07871429,0.63907692,1929,11/10/2019 23:43,female,1,2000, -0.579625,0.79941667,0.48907143,0.65553846,1929,11/11/2019 0:30,female,1,2000, -0.5782,0.83966667,1.01128571,1.385,1929,11/11/2019 0:25,female,1,2000, -0.63309091,1.041,0.56545455,0.4155,1929,11/11/2019 0:32,female,1,2000, -0.54511111,0.8235,0.69376923,0.713,1931,11/11/2019 1:17,female,1,2000, -0.7458,0.7495,0.68525,0.51961538,1931,11/11/2019 0:41,female,1,2000, -0.65363636,0.61021429,0.794,0.6457,1931,11/11/2019 1:32,female,1,2000, -0.61485714,0.50770588,0.597,0.957,1931,11/11/2019 0:57,female,1,2000, -0.989,1.03,0.949,0.8615,1931,11/11/2019 1:34,female,1,2000, -0.61690909,0.7681,1.0466,1.27425,1931,11/11/2019 1:08,female,1,2000, -0.5965,0.70133333,1.048,0.61709091,1931,11/11/2019 1:35,female,1,2000, -0.7643,1.013875,0.66730769,0.608625,1933,11/11/2019 3:49,female,1,2000, -0.4865,0.726,0.68,0.778,1933,11/11/2019 3:43,female,1,2000, -0.704,0.74092308,1.17725,0.6425,1933,11/11/2019 3:46,female,1,2000, -0.34433333,0.583,0.838,0.96271429,1933,11/11/2019 3:50,female,1,2000, -0.752,0.84666667,0.63475,0.74292308,1933,11/11/2019 3:47,female,1,2000, -0.63066667,0.74157143,0.92816667,0.77516667,1933,11/11/2019 3:51,female,1,2000, -0.825,1.05611111,0.857,0.89,1933,11/11/2019 3:48,female,1,2000, -0.66442857,0.49433333,0.50433333,0.6065,1937,11/11/2019 11:16,male,1,1992, -0.73157143,0.86844444,1.06233333,0.88433333,1937,11/11/2019 11:26,male,1,1992, -0.75211111,0.626875,0.74925,0.7039,1937,11/11/2019 11:35,male,1,1992, -0.545,0.60666667,0.51455556,0.73563636,1937,11/11/2019 11:03,male,1,1992, -0.46178947,0.5983,0.56192857,0.66754545,1937,11/11/2019 11:45,male,1,1992, -0.58455556,0.58458824,0.64641667,0.6882,1938,11/11/2019 20:22,male,1,1996, -0.4826875,0.56623529,0.5966,0.602,1938,11/11/2019 21:32,male,1,1996, -0.55521429,0.667,0.5269,0.775125,1939,11/11/2019 23:37,male,1,2000, -0.61214286,0.8222,0.53675,0.791625,1940,11/19/2019 23:07,male,0,1990, -1.64225,1.4632,1.89233333,2.50175,1943,12/10/2019 12:28,male,1,1976,3 -0.87733333,0.80192308,1.1048,1.08875,1951,12/10/2019 13:23,male,1,2001,4 -1.059,0.93628571,0.9017,0.77444444,1955,12/16/2019 19:04,male,1,2000,2 -0.616,0.56188889,0.60335714,0.5638,1957,12/16/2019 23:18,male,1,2000,3 -0.78,0.949125,0.97871429,0.8375,1958,12/17/2019 0:09,female,1,2000,3 -0.628,0.612,0.66075,0.52888889,1959,12/17/2019 0:12,male,1,2000,3 -0.63366667,0.663375,0.6354,0.75016667,1960,12/17/2019 7:36,male,1,1999,3 -0.6762,0.56194444,0.61890909,0.70323077,1961,12/23/2019 8:27,male,1,2000,4 -2.42083333,1.71866667,1.33475,2.068,1966,1/21/2020 12:02,male,1,1980,3 -1.17033333,1.1205,1.23255556,1.1522,1966,1/21/2020 12:03,male,1,1980,3 -0.64416667,0.656,0.62666667,0.75154545,1968,3/1/2020 15:47,female,1,1997,3 -0.6368,0.71209091,0.80391667,0.83685714,1968,3/1/2020 12:46,female,1,1997,3 -0.57284211,0.71454545,0.7185,0.71577778,1968,3/1/2020 13:01,female,1,1997,3 -0.6413,0.69744444,0.6728,0.98214286,1968,3/1/2020 13:03,female,1,1997,3 -0.64771429,0.6797,0.63025,0.74527273,1968,3/1/2020 13:07,female,1,1997,3 -0.625,0.711125,0.6222,0.73371429,1968,3/1/2020 13:11,female,1,1997,3 -0.551,0.6842,0.60994118,0.71242857,1968,3/1/2020 14:08,female,1,1997,3 -1.01714286,0.900875,0.84825,1.25085714,1968,2/21/2020 15:59,female,1,1997,3 -0.63388889,0.65823077,0.6687,0.789,1968,3/1/2020 14:11,female,1,1997,3 -0.69041667,0.69869231,0.7747,0.9562,1968,3/1/2020 11:32,female,1,1997,3 -0.74472727,0.892,0.81990909,1.03828571,1968,3/1/2020 11:10,female,1,1997,3 -0.6246,0.67085714,0.62722222,0.69973684,1968,3/1/2020 14:15,female,1,1997,3 -0.615625,0.65546154,0.7116,1.03522222,1968,3/1/2020 11:34,female,1,1997,3 -0.665375,0.704,0.665,0.96083333,1968,3/1/2020 11:13,female,1,1997,3 -0.64672727,0.65353846,0.87677778,0.78825,1968,3/1/2020 14:18,female,1,1997,3 -0.7443,0.7923,0.6995,0.81925,1968,3/1/2020 11:39,female,1,1997,3 -0.62206667,0.65754545,0.71066667,0.85175,1968,3/1/2020 11:18,female,1,1997,3 -0.629375,0.66591667,0.67692308,0.65025,1968,3/1/2020 15:40,female,1,1997,3 -0.689375,0.708,0.67763636,0.75383333,1968,3/1/2020 12:37,female,1,1997,3 -0.62875,0.615,0.724,0.64027273,1968,3/1/2020 11:29,female,1,1997,3 -0.67007692,0.77533333,0.64484615,0.7867,1968,3/1/2020 15:42,female,1,1997,3 -0.63523077,0.8174,0.74307143,0.76311111,1968,3/1/2020 12:39,female,1,1997,3 -0.67407143,0.75409091,0.73157143,0.836,1968,3/1/2020 15:45,female,1,1997,3 -0.70471429,0.68333333,0.68021429,0.7126,1968,3/1/2020 12:42,female,1,1997,3 -0.5955,0.6765,0.61738462,0.72125,1968,3/1/2020 15:45,female,1,1997,3 -0.69375,0.66433333,0.78166667,0.75563636,1968,3/1/2020 12:42,female,1,1997,3 -0.59854545,0.72855556,0.66921429,0.6905,1968,3/1/2020 15:48,female,1,1997,3 -0.75355556,0.61891667,0.77736364,0.84275,1968,3/1/2020 12:46,female,1,1997,3 -0.53654545,0.839,0.65192308,0.7,1968,3/1/2020 13:02,female,1,1997,3 -0.60209091,0.59738462,0.73125,0.9014,1968,3/1/2020 13:05,female,1,1997,3 -0.676,0.69935714,0.64858333,0.79014286,1968,3/1/2020 13:08,female,1,1997,3 -0.6062,0.76366667,0.59294737,0.79257143,1968,3/1/2020 13:12,female,1,1997,3 -0.56866667,0.68433333,0.60258333,0.74777778,1968,3/1/2020 14:09,female,1,1997,3 -0.68122222,0.7233,0.89428571,0.9973,1968,3/1/2020 11:07,female,1,1997,3 -0.7107,0.7308,0.7725,0.65084615,1968,3/1/2020 14:12,female,1,1997,3 -0.64766667,0.66966667,0.69154545,0.70977778,1968,3/1/2020 11:33,female,1,1997,3 -0.78733333,0.78,0.7523,1.29925,1968,3/1/2020 11:11,female,1,1997,3 -0.67133333,0.6995,0.81477778,0.7462,1968,3/1/2020 14:16,female,1,1997,3 -0.64018182,0.69007692,0.69266667,0.8545,1968,3/1/2020 11:35,female,1,1997,3 -0.61745455,0.786,0.72875,0.9099,1968,3/1/2020 11:14,female,1,1997,3 -0.57527273,0.63463636,0.6157,0.89381818,1968,3/1/2020 14:19,female,1,1997,3 -0.60983333,0.70278571,0.67055556,0.90436364,1968,3/1/2020 11:39,female,1,1997,3 -0.58069231,0.86125,0.77416667,0.80291667,1968,3/1/2020 11:18,female,1,1997,3 -0.64922222,0.69733333,0.61591667,0.72909091,1968,3/1/2020 15:40,female,1,1997,3 -0.5739,0.66138462,0.79911111,0.74345455,1968,3/1/2020 12:37,female,1,1997,3 -0.64992308,0.72822222,0.71009091,0.7145,1968,3/1/2020 11:31,female,1,1997,3 -0.636,0.6869,0.6932,0.65769231,1968,3/1/2020 15:43,female,1,1997,3 -0.62854545,0.69788889,0.641,0.72984615,1968,3/1/2020 12:40,female,1,1997,3 -0.77554545,0.7149,0.7514,0.83233333,1968,3/1/2020 15:46,female,1,1997,3 -0.63121429,0.6926,0.74,0.772375,1968,3/1/2020 12:43,female,1,1997,3 -0.744625,0.72444444,0.832,0.80466667,1968,3/1/2020 15:49,female,1,1997,3 -0.626125,0.678,0.60633333,0.749375,1968,3/1/2020 12:47,female,1,1997,3 -0.68244444,0.71958333,0.64578571,0.67522222,1968,3/1/2020 13:02,female,1,1997,3 -0.65676923,0.7005,0.643,0.8516,1968,3/1/2020 13:05,female,1,1997,3 -0.66490909,0.73385714,0.67984615,0.8353,1968,3/1/2020 13:08,female,1,1997,3 -0.60227273,0.81566667,0.59764286,0.868,1968,3/1/2020 13:12,female,1,1997,3 -0.91977778,0.7955,0.758,1.127,1968,2/21/2020 11:34,female,1,1997,3 -0.62741667,0.69833333,0.73516667,0.71484615,1968,3/1/2020 14:10,female,1,1997,3 -0.8186,0.7776,0.873,0.70866667,1968,3/1/2020 11:09,female,1,1997,3 -0.55,0.7641,0.59355556,0.631,1968,3/1/2020 14:12,female,1,1997,3 -0.504375,0.66275,0.772375,0.89244444,1968,3/1/2020 11:33,female,1,1997,3 -0.754125,0.73828571,0.8158,0.837,1968,3/1/2020 11:12,female,1,1997,3 -0.74975,0.72171429,0.73258333,0.6994,1968,3/1/2020 14:16,female,1,1997,3 -0.59692308,0.68116667,0.82311111,0.82185714,1968,3/1/2020 11:36,female,1,1997,3 -0.61923077,0.65875,0.86433333,0.96088889,1968,3/1/2020 11:16,female,1,1997,3 -0.63145455,0.676875,0.66383333,0.72053846,1968,3/1/2020 14:19,female,1,1997,3 -0.58555556,0.76376923,0.86733333,0.846125,1968,3/1/2020 11:40,female,1,1997,3 -0.6724,0.72785714,0.66873333,0.87411111,1968,3/1/2020 11:19,female,1,1997,3 -0.81333333,0.826125,0.74416667,0.866625,1968,3/1/2020 15:41,female,1,1997,3 -0.737875,0.69572727,0.692,0.65527273,1968,3/1/2020 12:38,female,1,1997,3 -0.60655556,0.69027273,0.5609,0.65464706,1968,3/1/2020 11:31,female,1,1997,3 -0.61916667,0.6452,0.66107692,1.0249,1968,3/1/2020 15:43,female,1,1997,3 -0.58115385,0.6329,0.741,0.81333333,1968,3/1/2020 12:40,female,1,1997,3 -0.7778,0.81307692,0.96528571,0.74545455,1968,3/1/2020 15:47,female,1,1997,3 -0.61863636,0.6605,0.74718182,0.67323077,1968,3/1/2020 12:45,female,1,1997,3 -0.53675,0.7,0.63169231,0.71007692,1968,3/1/2020 13:00,female,1,1997,3 -0.57871429,0.65342857,0.6562,0.68078571,1968,3/1/2020 13:03,female,1,1997,3 -0.59933333,0.69466667,0.67053846,0.887375,1968,3/1/2020 13:07,female,1,1997,3 -0.61378571,0.78928571,0.77077778,0.77772727,1968,3/1/2020 13:09,female,1,1997,3 -0.66263636,0.6998,0.67228571,0.81238462,1968,3/1/2020 14:05,female,1,1997,3 -0.649625,0.80644444,0.94022222,1.055125,1968,2/21/2020 11:35,female,1,1997,3 -0.64075,0.80066667,0.68845455,0.73,1968,3/1/2020 14:10,female,1,1997,3 -0.9196,0.777625,0.94014286,0.93538462,1968,3/1/2020 11:09,female,1,1997,3 -0.56269231,0.6835,0.62225,0.78408333,1968,3/1/2020 14:13,female,1,1997,3 -0.57628571,0.7116,0.6764,0.999125,1968,3/1/2020 11:34,female,1,1997,3 -0.7175,1.035,0.708,0.88842857,1968,3/1/2020 11:13,female,1,1997,3 -0.62858333,0.65222222,0.60038462,0.8122,1968,3/1/2020 14:18,female,1,1997,3 -0.703,0.75111111,0.741,0.74866667,1968,3/1/2020 11:37,female,1,1997,3 -0.7935,0.7629,0.94783333,0.75636364,1968,3/1/2020 11:17,female,1,1997,3 -0.58144444,0.68318182,0.628875,0.6651,1968,3/1/2020 15:39,female,1,1997,3 -0.69522222,0.64746154,0.7762,0.82777778,1968,3/1/2020 11:40,female,1,1997,3 -0.66321429,0.7003,0.799,0.9205,1968,3/1/2020 11:20,female,1,1997,3 -0.55066667,0.70385714,0.763,0.7949,1968,3/1/2020 15:42,female,1,1997,3 -0.61436364,0.72677778,0.77827273,0.7958,1968,3/1/2020 12:39,female,1,1997,3 -0.71811111,0.70508333,0.67272727,0.7163,1968,3/1/2020 15:44,female,1,1997,3 -0.58953333,0.72215385,0.9418,0.73566667,1968,3/1/2020 12:41,female,1,1997,3 -0.50023077,0.56538462,0.68621429,0.49584615,1969,1/28/2020 18:56,male,1,1993,4 -0.50985714,0.60361538,0.47964706,0.4445,1969,1/28/2020 18:58,male,1,1993,4 -0.49984615,0.59446154,0.57075,0.48638889,1969,1/28/2020 18:53,male,1,1993,4 -0.62230769,0.62608333,0.748,0.67290909,1971,2/13/2020 16:38,female,1,1987,3 -0.6422,0.59961538,0.79833333,0.54966667,1971,2/13/2020 16:39,female,1,1987,3 -1.11366667,0.7625,0.9192,1.29583333,1971,2/13/2020 16:36,female,1,1987,3 -0.741,0.72071429,0.98742857,0.799625,1971,2/13/2020 16:37,female,1,1987,3 -0.85125,1.13566667,0.94881818,1.02877778,1975,2/19/2020 14:01,female,1,1968,4 -0.88725,0.89142857,0.75409091,0.7071,1977,2/19/2020 14:32,female,1,1963,3 -0.984,0.90409091,0.885125,0.923875,1978,2/20/2020 7:07,female,1,1975,4 -0.83155556,0.8104,0.98877778,1.173375,1981,2/24/2020 17:20,male,1,1973,4 -0.93545455,1.1494,1.19471429,0.758,1989,4/16/2020 10:14,female,1,1962,3 -1.13516667,1.21,1.5504,0.9742,1989,4/17/2020 3:29,female,1,1962,3 -1.48475,1.8904,1.6048,1.54075,1989,4/15/2020 15:31,female,1,1962,3 -1.20366667,1.42866667,1.14522222,0.88157143,1989,4/19/2020 17:46,female,1,1962,3 -1.07085714,1.11833333,1.24866667,0.780125,1989,4/15/2020 16:01,female,1,1962,3 -1.3422,1.422,1.4042,1.46883333,1994,4/24/2020 22:39,female,1,1998,2 -1.07557143,0.84063636,0.611,0.72622222,1995,4/25/2020 23:16,male,1,1998,3 -1.47,1.167,0.793,8.334,1996,5/14/2020 12:53,male,1,1998,4 -0.95428571,3.5945,1.03733333,1.1655,2000,6/2/2020 18:07,male,1,1998,3 -0.755,0.69553846,0.8713,0.73058333,2001,6/2/2020 18:08,male,1,1997,3 -0.67435714,0.715,0.59081818,0.68918182,2003,6/15/2020 21:09,male,1,1991,4 -1.0605,1.266,1.12354545,1.1668,2004,8/26/2020 11:53,male,1,1979,5 -1.164,1.2795,0.736,0.687,2008,10/14/2020 10:21,female,1,1994,5 -0.8934,0.74271429,0.7306,0.83792308,2008,10/21/2020 18:36,female,1,1994,5 -0.927875,0.79315385,0.72888889,1.0588,2008,10/17/2020 18:45,female,1,1994,5 -0.81145455,0.8965,0.696,0.97709091,2008,4/3/2021 20:45,female,1,1994,5 -0.9386,0.78071429,0.69575,1.015,2008,10/21/2020 14:38,female,1,1994,5 -0.70972727,0.76416667,0.64754545,0.93081818,2008,4/7/2021 10:35,female,1,1994,5 -0.8102,0.7685,0.65157143,0.9399,2008,10/21/2020 16:35,female,1,1994,5 -0.8985,1.876,0.48833333,1.012,2008,4/22/2021 21:39,female,1,1994,5 -1.2505,1.058625,0.848,1.286,2009,10/14/2020 10:19,male,1,1994,4 -0.8762,1.05466667,0.8975,1.68566667,2009,10/20/2020 15:48,male,1,1994,4 -0.7185,0.850625,1.086125,1.06,2010,10/20/2020 17:51,male,1,1995,4 -0.75916667,0.85842857,1.14475,0.978,2010,10/22/2020 14:30,male,1,1995,4 -0.765875,0.76991667,0.823375,1.0035,2010,10/21/2020 14:33,male,1,1995,4 -0.64225,0.81528571,0.71553333,0.80688889,2010,10/22/2020 16:32,male,1,1995,4 -0.754,0.96957143,0.85285714,0.98011111,2010,10/20/2020 13:56,male,1,1995,4 -0.81,0.839,0.96157143,0.80183333,2010,10/21/2020 16:33,male,1,1995,4 -0.76283333,0.85166667,0.9826,1.06271429,2010,10/20/2020 16:03,male,1,1995,4 -0.878,0.83725,1.063,1.414,2010,10/21/2020 18:37,male,1,1995,4 -0.64683333,0.68573333,0.696625,0.85354545,2011,10/20/2020 15:48,male,1,2000,4 -0.60761538,0.58827273,0.99844444,0.6374,2012,10/20/2020 15:49,male,1,2001,2 -0.82125,0.82011111,0.77533333,0.98855556,2013,10/20/2020 15:48,female,1,2002,2 -0.7078,0.734,0.69714286,0.7867,2014,10/20/2020 15:48,male,1,1996,3 -0.68916667,0.61,0.57454545,0.62707143,2015,10/20/2020 15:47,male,1,2001,3 -0.69133333,0.84009091,0.7731,0.93422222,2016,10/20/2020 15:48,male,1,2001,2 -0.68622222,0.940625,0.78561538,0.727875,2017,10/20/2020 15:47,female,0,2001,3 -0.893,0.904,0.970375,0.78783333,2018,10/20/2020 15:48,male,1,2001,4 -0.67688889,0.52958333,0.6621875,0.60581818,2020,10/20/2020 15:48,male,1,2001,3 -1.14566667,0.8251,1.03125,0.89914286,2022,10/20/2020 15:48,male,1,2001,2 -0.7047,0.8233,0.92842857,0.58507692,2023,10/20/2020 15:48,male,1,2002,3 -1.19266667,1.115,1.13585714,0.968,2024,10/20/2020 15:51,male,1,2001,3 -1.109875,0.6484,0.6755,1.11111111,2026,10/20/2020 16:03,male,1,1999,4 -0.50942857,0.5341,0.65218182,0.58753846,2026,10/22/2020 14:24,male,1,1999,4 -0.6092,0.779125,0.68881818,0.74569231,2029,10/22/2020 14:23,male,0,1999,3 -0.86654545,0.77766667,0.71322222,0.77116667,2030,10/20/2020 16:03,male,1,2001,4 -0.91625,0.85866667,0.51025,0.78333333,2030,10/22/2020 14:35,male,1,2001,4 -0.91775,0.825625,0.693,0.84483333,2032,10/22/2020 14:24,female,1,2001,3 -0.80857143,1.221125,0.6815,0.7017,2032,10/22/2020 14:23,female,1,2001,3 -0.69261538,0.73014286,0.66333333,0.9584,2033,10/22/2020 14:24,male,1,2001,4 -0.66933333,0.6346,0.6978,0.93166667,2034,10/22/2020 14:22,male,1,2001,4 -0.86525,0.7769,0.83536364,0.9395,2037,10/20/2020 16:04,male,1,2001,4 -0.87214286,0.91983333,0.82942857,0.87107143,2037,10/22/2020 14:25,male,1,2001,4 -0.996,1.02033333,0.9122,0.91744444,2037,10/20/2020 16:03,male,1,2001,4 -0.68122222,0.62566667,0.57990909,0.721625,2040,10/20/2020 17:54,male,1,2002,4 -0.673,0.6395,0.62963636,0.83584615,2041,10/20/2020 17:55,male,1,1999,4 -0.71611111,1.05663636,0.661,0.96122222,2042,10/20/2020 17:54,male,0,2001,3 -0.6514,0.930875,0.76790909,0.97236364,2043,10/20/2020 17:54,male,1,2000,3 -0.92766667,0.72453846,1.0378,0.81475,2045,10/20/2020 17:54,male,1,2001,3 -0.6274,0.70488889,0.54116667,0.58811111,2046,10/20/2020 17:51,male,1,2001,3 -0.59722222,0.69718182,0.64791667,0.59535714,2047,10/20/2020 17:51,male,1,2001,3 -0.7734,0.78811111,0.91111111,1.2062,2049,10/20/2020 17:54,male,1,2001,3 -0.651,0.6141875,0.70875,0.71441667,2050,10/20/2020 17:51,male,1,2001,4 -0.94285714,0.8027,0.994875,0.898,2054,10/20/2020 17:54,male,1,2001,3 -0.90890909,0.95671429,0.93471429,0.84175,2055,10/20/2020 17:51,male,1,2001,3 -0.871,0.85383333,0.7585,1.004,2056,10/20/2020 18:07,male,1,2001,3 -0.78944444,0.66128571,0.8654,0.86581818,2059,10/20/2020 17:54,male,1,2001,3 -0.65090909,0.56078947,0.60942857,0.841875,2060,10/20/2020 18:06,female,1,2001,3 -0.6129375,0.636,0.62028571,0.72727273,2060,10/22/2020 16:31,female,1,2001,3 -0.7509,0.66316667,0.65376923,0.74015385,2060,10/20/2020 17:51,female,1,2001,3 -0.61869231,0.56291667,0.8833,0.8945,2061,10/20/2020 17:54,male,1,2001,3 -0.65828571,0.76181818,0.63066667,0.71526667,2063,10/20/2020 17:54,male,0,2000,3 -0.98316667,1.07142857,1.15057143,1.26616667,2064,10/20/2020 17:56,male,1,2001,3 -0.689875,0.76692308,0.80814286,0.71,2070,10/20/2020 19:28,male,1,2002,4 -1.3075,0.964,2.123,2.615,2071,10/20/2020 19:35,male,1,2002,2 -0.78383333,1.06314286,0.92009091,0.83066667,2071,10/22/2020 19:24,male,1,2002,2 -0.72209091,0.7816,0.5870625,0.76736364,2072,10/20/2020 19:31,male,1,2002,4 -1.1762,0.87083333,0.71988889,0.7620625,2075,10/20/2020 19:30,male,1,2001,4 -0.831,0.746,0.92233333,1.01309091,2077,10/20/2020 19:39,male,1,2001,3 -0.96885714,0.7317,0.74175,0.85936364,2078,10/20/2020 19:39,male,1,2002,3 -0.927125,0.6795,0.66144444,0.71315385,2079,10/20/2020 19:39,male,1,2001,5 -1.03457143,0.61383333,0.85577778,0.68254545,2080,10/20/2020 19:39,male,1,2001,4 -1.022,0.8768,1.08283333,0.82755556,2082,10/20/2020 19:39,male,1,2001,2 -0.68392308,0.70577778,0.68528571,0.495,2083,10/20/2020 19:39,male,1,2001,4 -0.71225,0.58075,0.58473684,0.5893,2084,10/20/2020 19:39,male,1,2001,3 -0.64145455,0.90171429,0.86,0.924,2085,10/20/2020 19:39,male,1,2002,3 -0.67013333,0.60685714,0.7715,0.676,2086,10/20/2020 19:39,male,1,1989,4 -1.18066667,0.94354545,1.0206,1.3832,2087,10/20/2020 19:39,male,1,2001,3 -0.91842857,1.004,0.92333333,0.87325,2088,10/20/2020 19:46,female,1,2002,3 -0.65807692,0.61692308,0.73416667,0.76216667,2088,10/22/2020 16:32,female,1,2002,3 -3.4408,0.78942857,1.0116,0.8645,2090,10/20/2020 20:01,male,1,1983,3 -1.24628571,1.46716667,1.4204,1.0582,2091,10/20/2020 20:13,female,1,1972,3 -1.00266667,0.964,1.05533333,1.0019,2092,10/20/2020 20:26,male,1,1977,2 -1.2426,0.935,1.12683333,1.56,2093,10/20/2020 20:37,female,1,1997,3 -3.34825,2.12766667,1.772,2.11166667,2094,10/20/2020 20:50,female,0,1975,3 -0.53147619,0.58811111,0.66436364,0.65844444,2095,10/20/2020 22:13,male,1,2002,3 -0.89785714,1.025,1.522,0.85228571,2102,10/21/2020 9:52,male,1,1968,5 -0.772,0.77388889,0.78544444,1.027375,2107,10/21/2020 9:55,female,1,1992,4 -0.7056,0.7583,0.66766667,0.82328571,2107,10/21/2020 9:56,female,1,1992,4 -0.634,0.7848,0.71290909,0.5532,2119,10/21/2020 14:38,male,1,2001,3 -0.83991667,0.95366667,0.95525,0.7175,2120,10/21/2020 14:38,female,1,2002,2 -0.6871,1.61185714,0.73075,1.0936,2120,11/6/2020 14:07,female,1,2002,2 -0.95016667,0.6886,0.8315,1.014,2121,10/21/2020 14:38,male,1,2001,3 -0.66942857,0.53325,1.07575,0.72290909,2124,10/21/2020 14:38,male,1,2001,3 -0.67822222,0.61335294,0.78455556,0.772875,2126,10/21/2020 14:33,male,1,2002,3 -0.65458333,0.63307692,0.584,0.95822222,2129,10/21/2020 14:38,male,1,2001,4 -1.17611111,1.032875,0.987,0.9882,2130,10/21/2020 14:33,male,1,2001,3 -0.63609091,0.65915385,0.577875,0.62153333,2131,10/21/2020 14:33,male,1,2001,3 -0.865,0.706125,0.82718182,1.01022222,2134,10/21/2020 14:41,male,1,2002,2 -0.8355,0.64627273,0.75011111,0.8689,2134,10/22/2020 22:58,male,1,2002,2 -0.81163636,0.73214286,0.96625,0.7445,2134,11/3/2020 14:02,male,1,2002,2 -0.8646,0.82166667,0.93885714,0.747,2135,10/21/2020 14:38,male,1,2001,4 -0.65975,0.752,0.84122222,1.097,2140,10/21/2020 14:38,male,1,2001,3 -1.07828571,1.2166,1.8636,1.16116667,2141,10/21/2020 16:34,female,1,1995,2 -0.65333333,0.961625,1.0702,0.924,2143,10/21/2020 16:34,male,1,2001,3 -1.04771429,1.74,1.361125,1.287,2144,10/21/2020 16:35,male,0,2001,3 -0.7355,0.643125,0.7515,0.8178,2145,10/21/2020 16:35,male,0,2001,3 -0.92336364,0.91385714,0.95275,0.89133333,2146,10/21/2020 16:34,male,1,2001,3 -1.30583333,0.93266667,0.74728571,0.7885,2149,10/21/2020 16:34,female,1,2001,3 -0.53428571,1.15242857,0.67723529,1.59975,2150,10/21/2020 16:35,male,1,2001,3 -0.671375,0.7198,0.573,0.839,2151,10/21/2020 16:35,male,1,2001,3 -0.61366667,0.52983333,0.58141667,0.6812,2152,10/21/2020 16:34,male,1,2001,4 -0.65028571,0.63166667,0.68253846,0.4645,2153,10/21/2020 16:34,male,1,2001,3 -0.5593,0.59,0.59464706,0.56954545,2153,10/21/2020 18:23,male,1,2001,3 -0.644,0.57441667,0.76,0.78361538,2155,10/21/2020 16:35,male,1,2001,3 -1.32085714,1.31416667,1.1272,1.4342,2157,10/21/2020 16:35,female,1,2002,3 -1.012375,0.61785714,1.18657143,1.130625,2159,10/21/2020 16:34,male,1,2001,3 -0.76014286,0.71211111,0.80891667,0.8324,2160,10/21/2020 16:33,male,1,2001,1 -0.5608125,0.721,0.71766667,0.667,2163,10/21/2020 16:50,male,1,2002,2 -1.11471429,1.18783333,1.03566667,0.788,2164,10/21/2020 16:34,female,1,2001,3 -1.731,0.998,1.076,1.094,2164,10/31/2020 12:33,female,1,2001,3 -0.8751,0.7334,0.9572,1.1,2164,10/31/2020 19:42,female,1,2001,3 -0.77,0.789,0.73877778,0.85683333,2167,10/21/2020 16:33,male,1,2002,2 -0.905,0.98,1.193,1,2168,10/21/2020 16:34,male,1,2002,2 -0.96466667,0.7797,0.84,1.303,2170,10/21/2020 16:33,male,0,2002,1 -0.51931579,0.7583,0.71966667,0.80214286,2171,10/21/2020 16:35,male,1,2002,5 -0.73157143,0.862875,0.77583333,0.84914286,2171,10/21/2020 16:34,male,1,2002,5 -1.29116667,1.0058,1.08009091,0.97,2172,10/21/2020 16:34,female,1,1998,3 -0.902125,0.7138,0.808125,0.8624,2173,10/21/2020 18:36,male,1,2001,4 -0.69433333,0.73288889,0.76155556,0.5852,2174,10/31/2020 9:52,male,1,2001,4 -0.68827273,0.68344444,0.78861538,0.685,2174,10/21/2020 18:37,male,1,2001,4 -1.495,0.89314286,0.98371429,1.0816,2175,10/21/2020 18:36,female,1,2001,3 -0.866,0.91771429,0.89225,0.8608,2175,10/21/2020 18:37,female,1,2001,3 -0.864,0.98175,0.762,0.87869231,2176,10/21/2020 18:37,male,1,2001,4 -0.86733333,1.003,0.9393,1.045,2176,10/21/2020 18:36,male,1,2001,4 -0.98942857,0.81257143,0.9955,1.03857143,2178,10/21/2020 18:36,male,1,2001,3 -1.12166667,0.79369231,0.93527273,0.98,2179,10/21/2020 18:37,male,1,2001,3 -0.9914,0.97983333,1.296,1.078125,2180,10/21/2020 18:37,male,0,2001,2 -1.2164,0.94216667,1.14390909,1.0454,2181,10/21/2020 18:37,male,1,2001,2 -1.2936,1.39083333,1.17488889,0.8478,2182,10/21/2020 18:37,male,1,2001,3 -1.225,0.8114,0.85553333,1.0654,2183,10/21/2020 18:37,female,1,2001,3 -1.129,1.00590909,0.821125,1.099,2184,10/21/2020 18:36,male,1,1999,3 -1.07325,0.73927273,1.25344444,1.0235,2187,10/21/2020 18:38,male,1,2001,3 -0.5221,0.57276923,0.46678571,0.48984615,2188,10/21/2020 18:37,male,1,2000,4 -0.53907692,1.09625,0.66936364,0.6284,2189,10/21/2020 18:38,male,1,2001,4 -0.89133333,0.7406,0.6501,0.91711111,2190,10/21/2020 18:37,male,1,2001,3 -0.76322222,0.68881818,0.9336,0.82233333,2191,10/21/2020 18:38,male,1,2001,3 -0.76322222,0.68881818,0.9336,0.82233333,2191,10/21/2020 18:38,male,1,2001,3 -0.64223077,0.65722222,0.661,0.7976,2191,10/26/2020 19:09,male,1,2001,3 -0.599,0.805,0.583,1.199,2191,11/2/2020 18:15,male,1,2001,3 -1.051,1.19725,1.057,1.23877778,2193,10/21/2020 18:35,male,1,2001,2 -0.95275,1.022375,1.0732,1.24042857,2193,10/21/2020 18:47,male,1,2001,2 -0.7837,0.80928571,0.76711111,1.00844444,2195,10/21/2020 18:37,male,1,2002,3 -1.20628571,1.23625,1.5255,1.7642,2198,10/21/2020 18:38,male,1,2002,3 -1.836,0.77133333,1.03066667,1.017,2199,10/21/2020 18:37,male,1,2002,4 -0.72,1.116,1.0325,0.503,2200,10/21/2020 21:01,male,1,1981,5 -0.60845455,0.690625,0.699625,0.73175,2201,10/21/2020 21:03,male,0,1995,3 -0.7765,0.68475,0.75538462,0.71628571,2202,10/22/2020 9:58,male,1,1999,3 -1.1612,0.623,1.17766667,0.684,2203,10/22/2020 11:07,female,1,1965,3 -0.77781818,1.09983333,0.82757143,1.00125,2205,10/22/2020 14:26,male,1,2001,3 -0.761,0.63353846,0.668125,0.688625,2206,10/22/2020 14:39,male,1,2001,4 -0.81822222,1.00477778,0.79233333,0.8755,2207,10/27/2020 10:07,female,1,2001,3 -0.8068,0.92466667,0.82288889,0.97007692,2207,10/27/2020 10:55,female,1,2001,3 -0.97377778,0.99488889,1.06283333,1.26225,2207,10/27/2020 10:17,female,1,2001,3 -2.2216,2.266,2.44033333,2.3145,2207,10/27/2020 10:29,female,1,2001,3 -1.03225,0.8284,1.0105,0.8885,2207,10/22/2020 14:30,female,1,2001,3 -1.5265,1.568,1.94333333,2.167,2207,10/27/2020 10:41,female,1,2001,3 -0.85,2.5996,0.8726,0.932,2208,10/22/2020 14:31,female,1,2002,3 -0.88622222,0.85181818,0.7505,0.94614286,2211,10/22/2020 16:03,male,1,2001,3 -1.263,0.80155556,0.68183333,1.0866,2213,10/22/2020 16:32,male,1,2001,3 -0.64377778,0.71845455,0.88557143,0.68957143,2215,10/22/2020 18:13,male,1,1985,3 -0.60736364,0.61033333,0.719,0.59533333,2216,10/22/2020 18:31,male,1,2001,4 -0.65691667,0.7415,0.68885714,0.67575,2217,10/22/2020 19:21,male,1,2001,4 -1.0267,1.0534,1.41375,0.92388889,2218,10/22/2020 19:22,male,1,2001,2 -1.1145,0.7898,0.931125,0.90833333,2219,10/22/2020 19:22,male,1,2001,3 -0.58927273,0.68092308,0.55038462,0.55938462,2220,10/22/2020 20:02,male,1,2001,4 -0.711,0.6869,0.772,0.71216667,2221,10/22/2020 20:33,male,1,2001,3 -0.72426667,0.62223077,0.82228571,0.67971429,2221,10/22/2020 20:34,male,1,2001,3 -1.01672727,0.67422222,0.796,0.95242857,2226,10/23/2020 14:40,male,1,2002,2 -0.944875,0.98207692,1.295,1.1075,2227,10/23/2020 14:15,male,1,2001,1 -1.611625,1.27425,1.16966667,1.11571429,2229,10/23/2020 14:31,male,1,1999,2 -0.82928571,0.86866667,0.84864286,0.84409091,2231,10/23/2020 14:51,female,1,2000,4 -0.99911111,1.01114286,0.75922222,0.95514286,2232,10/23/2020 14:52,female,1,1982,3 -0.7233,0.701,0.69075,1.2722,2233,10/23/2020 15:01,male,1,1999,4 -0.987,1.256,1.415,1.479,2234,10/23/2020 15:07,male,1,1990,4 -1.036,0.6905,0.95966667,1.18809091,2234,10/31/2020 16:37,male,1,1990,4 -0.70236364,0.6917,0.922875,0.7436,2235,10/23/2020 15:18,female,1,1975,3 -0.86914286,1.247,1.195,0.9012,2236,10/31/2020 16:27,female,1,1985,3 -0.87275,0.6605,1.06871429,0.9795,2236,10/31/2020 16:28,female,1,1985,3 -1.25816667,0.8176,1.22157143,1.13042857,2237,10/31/2020 19:59,male,1,1973,4 -1.319,1.7375,1.125,0.984,2238,10/23/2020 15:39,female,1,1963,2 -1.417,1.4924,0.97275,1.27,2239,10/23/2020 15:47,male,1,1975,1 -1.785,2.8265,1.575,2.373,2240,10/23/2020 15:52,male,1,1958,1 -0.82433333,0.92318182,0.8316,0.934,2242,10/23/2020 16:31,male,1,1980,4 -0.71707692,0.67922222,0.716,0.66744444,2242,10/23/2020 16:40,male,1,1980,4 -0.954,1.15916667,0.80471429,1.0773,2243,10/23/2020 16:38,male,1,1996,4 -0.8325,0.9257,0.86636364,0.81311111,2243,10/27/2020 18:14,male,1,1996,4 -0.7446,0.81066667,0.6793,0.65621429,2244,10/23/2020 17:02,male,1,2001,3 -1.196625,1.0965,1.1395,1.57325,2246,10/23/2020 17:04,male,1,1994,3 -1.22033333,1.11518182,1.32016667,1.2088,2247,10/23/2020 17:18,male,1,1963,2 -1.321,1.7118,2.20625,1.85825,2247,10/23/2020 17:19,male,1,1963,2 -1.70675,1.575,1.17883333,1.2888,2248,10/23/2020 17:20,female,1,1972,2 -0.739,1.171,1.09655556,0.908125,2249,10/23/2020 17:28,male,1,1968,2 -0.71628571,0.73,0.941375,0.55575,2250,10/23/2020 18:41,male,1,2001,3 -0.9392,1.21485714,0.78641667,0.859125,2251,10/23/2020 18:06,male,1,1997,4 -0.723,0.7815,0.666,0.942,2252,10/23/2020 18:20,male,1,2003,3 -0.75171429,0.695,0.64275,0.81616667,2253,10/23/2020 20:26,female,0,2001,3 -0.69975,0.77885714,0.7441,0.68666667,2256,10/24/2020 12:37,male,1,1992,3 -0.510625,0.5195,0.62081818,0.642,2258,10/24/2020 13:38,male,1,2001,3 -0.87722222,1.01983333,0.9215,1.02133333,2260,10/24/2020 15:06,female,1,2001,3 -1.2605,1.2965,2.8395,0.7165,2261,10/24/2020 16:48,male,1,1975,4 -1.34733333,1.216,1.277,1.5858,2262,10/24/2020 17:08,female,0,1975,3 -0.67114286,0.65418182,0.79142857,0.7795625,2263,10/24/2020 17:14,male,1,2001,4 -0.66975,0.54181818,0.64322222,0.9178,2264,10/24/2020 19:30,male,1,1966,2 -0.79375,0.5884,0.48,0.87,2265,10/24/2020 19:37,male,1,1972,2 -0.7994,0.69323077,1.12275,1.36116667,2266,10/24/2020 21:18,female,1,1986,2 -1.37033333,1.485,2.154,1.18,2268,10/27/2020 19:08,male,0,1955,1 -1.917,1.465,1.213,0.962,2269,10/24/2020 23:49,male,1,1986,3 -1.492,1.4858,1.8156,1.134,2272,10/25/2020 0:20,male,1,1968,3 -1.66914286,1.49,1.43633333,1.8052,2273,10/25/2020 12:28,male,1,1966,1 -1.38171429,1.3952,1.42725,1.4368,2275,10/25/2020 13:11,female,1,1963,2 -0.76641667,0.61572727,0.86188889,0.84957143,2277,10/25/2020 21:28,male,1,2001,3 -0.73092308,0.962,0.93183333,0.88728571,2278,10/25/2020 13:40,male,1,2001,2 -1.20433333,1.81475,3.432,1.6738,2279,10/25/2020 14:01,female,1,1969,2 -2.677,2.11033333,1.826,1.742,2281,10/25/2020 14:52,male,1,1954,2 -0.911,0.7895,1.16242857,0.95222222,2282,10/25/2020 20:07,female,1,2000,2 -0.94633333,0.96528571,0.854,0.91357143,2282,10/25/2020 20:16,female,1,2000,2 -1.33516667,1.5106,1.20625,2.03,2283,10/25/2020 16:44,female,1,2003,3 -1.2875,0.80616667,0.93166667,0.62683333,2283,10/31/2020 16:22,female,1,2003,3 -0.89022222,0.73611111,0.59922222,0.81358333,2285,10/25/2020 18:36,male,1,2001,3 -1.4056,1.37533333,2.0395,1.1645,2286,10/25/2020 19:06,male,1,1968,2 -0.977125,0.869375,0.77433333,1,2288,10/25/2020 19:48,male,1,2001,4 -2.691,2.922,2.3975,2.713,2289,10/25/2020 19:23,female,1,1948,1 -1.94133333,1.8845,1.9864,2.09,2290,10/25/2020 19:32,male,1,1978,2 -0.939,1.167,1.1175,1.50566667,2291,10/25/2020 19:39,female,1,1995,2 -1.9046,2.81133333,2.06466667,1.78033333,2292,10/25/2020 19:51,female,1,1962,2 -3.05033333,1.66916667,1.7955,1.585,2293,10/25/2020 20:06,male,1,1955,2 -0.82614286,1.35633333,0.94083333,0.79783333,2294,10/25/2020 20:06,female,1,1995,2 -0.961375,1.5712,0.97357143,0.88875,2295,10/25/2020 21:18,female,1,1981,2 -1.09942857,1.37666667,1.12166667,1.125,2296,10/25/2020 21:04,female,1,1972,3 -1.66916667,1.1475,1.2,1.1094,2297,10/25/2020 21:21,male,0,1990,3 -1.01466667,1.222,1.206,0.89154545,2298,10/25/2020 21:16,male,1,1970,3 -1.009,1.20575,1.1066,1.150875,2299,10/25/2020 21:34,male,1,1942,2 -0.86383333,0.78114286,0.82641667,0.79225,2300,10/25/2020 21:40,female,1,1983,3 -1.15571429,1.08175,1.05971429,1.327,2301,10/25/2020 21:47,female,1,1947,2 -0.81163636,0.954,0.611,0.9128,2302,10/25/2020 22:19,male,1,2001,3 -1.00392308,0.8407,1.20633333,0.95,2303,10/26/2020 10:12,female,1,1999,3 -1.6702,1.709,1.6435,1.378,2304,10/26/2020 9:55,female,1,1978,2 -1.266,1.02675,1.007,1.01922222,2304,11/2/2020 17:45,female,1,1978,2 -1.8635,2.02925,1.88966667,1.87,2305,10/26/2020 10:23,female,1,1968,1 -1.59966667,1.8446,1.6722,1.506,2306,10/26/2020 10:33,male,1,1944,1 -0.6402,0.60609091,0.51068421,0.55,2309,10/26/2020 15:05,male,1,2001,3 -0.80091667,1.16616667,0.901125,1.0754,2310,11/3/2020 15:31,male,1,2001,2 -0.95883333,0.76511111,0.72453846,0.7524,2311,10/27/2020 19:19,female,1,2001,3 -0.87575,0.78769231,0.84555556,0.63375,2312,10/26/2020 18:30,female,0,1975,4 -0.776125,0.91483333,0.764,0.8549,2315,10/28/2020 16:33,male,0,2001,3 -1.10833333,0.9595,1.711,1.43583333,2316,10/26/2020 22:28,female,1,1983,3 -0.79292308,0.794,0.89275,0.8245,2317,10/27/2020 10:36,female,1,2001,3 -2.743,2.01233333,2.888,2.901,2319,10/27/2020 12:06,male,1,1989,2 -1.415,1.7435,2.77366667,1.226,2321,10/27/2020 18:57,female,1,1975,3 -1.1402,1.2414,0.93944444,1.057625,2322,10/27/2020 18:58,female,1,1966,2 -1.211875,0.92827273,1.1404,1.27433333,2323,10/27/2020 19:09,male,1,1971,2 -0.79366667,0.758,0.6924,0.663,2324,10/27/2020 19:31,male,1,1998,3 -0.792,0.80725,0.7584,1.04733333,2327,10/27/2020 21:44,male,1,2001,4 -0.9045,0.66666667,1.004,0.897,2328,10/27/2020 23:07,male,1,1995,3 -0.7765,0.71722222,0.77511111,0.908,2334,10/28/2020 12:03,female,1,1999,3 -2.773,2.07866667,1.4802,1.6378,2335,10/28/2020 13:46,female,1,1955,2 -0.63875,0.59916667,0.7614,0.984,2337,10/28/2020 15:00,female,1,1998,1 -1.1276,1.076,1.1982,1.0792,2338,10/28/2020 15:17,female,1,2004,2 -0.5075,0.55790909,0.5208,0.844,2340,10/28/2020 15:44,male,1,2001,3 -0.7575,0.62533333,0.7698,0.711,2341,10/28/2020 15:45,male,1,2001,4 -0.782,0.69316667,0.75892308,0.6858,2342,10/28/2020 15:45,female,1,2006,2 -1.16471429,1.0065,1.51157143,0.84716667,2346,10/28/2020 19:13,female,1,1975,2 -0.65525,0.5729,0.8472,0.69436364,2347,10/28/2020 19:21,male,1,1969,3 -1.1924,0.55330769,0.677,0.696875,2348,10/28/2020 19:36,female,1,1989,2 -1.90811111,1.5515,1.058,1.2145,2349,10/28/2020 19:30,male,1,1958,2 -1.625,0.959,0.784,0.861,2351,10/28/2020 20:06,male,1,1970,3 -1.2758,1.08014286,1.33888889,1.12766667,2353,10/28/2020 20:17,female,1,1977,2 -1.306,1.0565,1.458,1.162,2356,10/29/2020 2:25,male,1,1968,2 -1.1198,1.37542857,0.944,0.8669,2357,10/29/2020 2:37,female,1,1991,3 -1.1886,1.106,0.94257143,1.40033333,2358,10/29/2020 11:39,male,1,1966,2 -0.9798,0.775625,0.76772727,1.0112,2359,10/29/2020 12:05,male,1,1999,2 -0.58463636,0.70133333,0.69416667,0.9075,2360,10/29/2020 12:13,female,0,1994,3 -1.98166667,1.42757143,1.187,1.643,2361,10/29/2020 12:24,male,1,1973,2 -0.58445455,0.73414286,0.5956,0.63515789,2362,10/29/2020 13:04,female,0,1989,3 -2.20833333,2.085,2.414,3.5955,2363,10/29/2020 13:14,male,0,1967,2 -4.4185,3.965,3.511,4.0765,2364,10/29/2020 13:24,male,1,1956,1 -0.74633333,0.81707692,0.78441667,0.79866667,2365,10/29/2020 15:14,female,1,1995,3 -0.809,1.215,1.29657143,1.01514286,2368,10/30/2020 19:38,male,1,2001,2 -1.03575,1.34616667,1.22985714,1.19275,2368,10/30/2020 19:20,male,1,2001,2 -1.99666667,1.20222222,1.60366667,0.804,2370,10/31/2020 12:54,female,1,1998,4 -1.012,1.2,1.3985,0.90566667,2370,10/31/2020 13:15,female,1,1998,4 -0.76385714,0.74411111,1.07866667,0.99954545,2370,10/31/2020 19:50,female,1,1998,4 -1.7176,1.2395,1.076,1.11158333,2371,10/31/2020 13:28,male,1,1990,4 -1.065625,1.03075,1.09222222,0.96528571,2371,10/31/2020 13:28,male,1,1990,4 -1.44314286,0.73322222,1.03985714,1.1504,2372,10/31/2020 13:51,female,0,1985,3 -1.1067,1.11975,1.158125,1.206,2372,10/31/2020 13:52,female,0,1985,3 -1.18933333,0.89628571,1.11077778,1.156,2373,10/31/2020 14:10,male,1,1975,3 -0.8395,1.16314286,1.12311111,0.739625,2373,10/31/2020 14:11,male,1,1975,3 -1.50683333,0.9806,1.048,1.31675,2374,10/31/2020 14:29,female,1,1969,2 -0.95,0.882,1.2622,1.127875,2374,10/31/2020 14:30,female,1,1969,2 -1.57828571,1.757,2.9095,1.7515,2375,10/31/2020 14:52,male,1,1963,1 -1.2028,1.14225,1.196,1.19085714,2375,10/31/2020 14:53,male,1,1963,1 -1.7635,1.17,2.074,2.2294,2376,10/31/2020 18:29,male,1,1953,2 -0.6006,0.59666667,0.6155,0.871,2377,10/31/2020 19:03,male,1,1972,2 -0.52815,0.666,0.682,0.729375,2378,10/31/2020 19:12,male,1,1970,1 -0.5643125,0.60527273,0.64122222,0.74809091,2379,10/31/2020 19:20,male,1,1964,2 -5.88,2.3145,3.462,3.975,2381,10/31/2020 20:21,male,1,1959,3 -1.877,1.9786,1.88075,2.26666667,2381,10/31/2020 20:40,male,1,1959,3 -0.868,0.973,2.2395,0.952,2383,10/31/2020 21:40,male,1,1995,3 -0.892,1.078875,0.84075,0.8065,2384,11/2/2020 17:34,female,1,1985,2 -1.1305,1.03728571,0.96718182,1.06683333,2386,11/2/2020 17:57,male,1,1944,1 -4.297,4.791,1.779,2.477,2387,11/2/2020 19:22,male,1,1965,3 -0.970625,0.76516667,1.06716667,0.96681818,2391,11/2/2020 20:24,male,1,2001,3 -1.617,1.2974,1.396,1.31811111,2392,11/2/2020 22:03,male,1,1960,4 -1.31577778,1.47425,1.833,1.5272,2393,11/3/2020 9:55,female,1,1991,3 -2.70375,5.4105,1.9675,1.6535,2394,11/3/2020 10:12,male,1,1971,1 -1.4356,1.2895,1.996,3.604,2395,11/3/2020 10:33,female,1,1971,1 -1.3435,2.02766667,1.659,2.1244,2395,11/3/2020 10:36,female,1,1971,1 -0.50418182,0.69958333,1.0378,0.628875,2396,11/3/2020 11:00,male,1,1987,4 -3.0842,3.408,2.023,2.36333333,2397,11/3/2020 11:13,male,1,1952,1 -1.8645,1.73766667,1.79228571,2.942,2398,11/3/2020 12:02,male,1,1949,1 -1.35544444,1.286,1.236,2.12766667,2401,11/3/2020 14:38,male,1,1999,2 -1.2514,1.23275,1.5196,1.8966,2402,11/3/2020 17:05,male,0,1989,3 -2.42933333,2.61525,1.99866667,5.986,2403,11/3/2020 17:15,female,1,1973,1 -1.37233333,1.31025,0.88477778,1.564,2404,11/3/2020 17:28,male,1,1969,2 -1.768,1.58816667,1.37825,1.703,2405,11/3/2020 17:27,male,1,1944,3 -1.04766667,0.97285714,0.79407143,0.9754,2407,11/3/2020 17:28,male,1,2001,4 -1.04391667,1.197,0.9969,1.216,2408,11/3/2020 17:36,female,1,1962,3 -0.5472,0.669,0.582,0.58668421,2409,11/3/2020 20:09,male,1,1993,5 -0.608375,0.82866667,0.5275,0.5676,2410,11/3/2020 21:38,male,1,1995,3 -1.9158,1.432,1.1755,1.32914286,2411,11/3/2020 22:11,female,1,2002,2 -0.705,0.738,0.71175,0.98333333,2411,11/3/2020 23:06,female,1,2002,2 -1.912,1.49666667,1.309,2.3832,2412,11/3/2020 22:25,female,1,1977,2 -1.7784,1.889,1.93425,2.5,2413,11/3/2020 22:53,male,1,1968,2 -1.355,1.5525,1.67542857,1.62083333,2414,11/4/2020 16:56,male,1,1986,3 -0.87466667,0.8705,1.3095,1.32928571,2414,11/4/2020 16:57,male,1,1986,3 -2.64866667,1.8235,1.20411111,1.64675,2415,11/4/2020 17:16,female,1,1974,2 -1.5786,0.53977778,1.229,1.437,2416,11/4/2020 17:40,male,1,1996,2 -1.857,1.42155556,1.4445,2.15175,2418,11/5/2020 19:33,male,1,1965,2 -0.6969,1.06614286,0.59635714,0.97028571,2421,11/4/2020 18:58,male,1,2001,3 -0.66258333,0.839,1.3618,0.79644444,2422,11/5/2020 11:10,male,1,1979,2 -0.88816667,0.72955556,0.752,0.882,2423,11/5/2020 11:33,male,0,1986,5 -1.193,0.829375,0.8638,0.8698,2424,11/8/2020 13:20,male,1,2001,4 -0.65353333,0.5405,0.6746,0.82381818,2425,11/10/2020 18:55,male,1,2001,1 -0.99533333,0.942125,0.8874,1.162,2427,11/11/2020 10:18,male,1,1999,3 -1.411,2.09875,1.399,1.286375,2429,11/14/2020 17:55,male,1,1954,3 -1.37385714,1.001,1.01775,1.1916,2430,11/16/2020 17:04,male,1,2001,2 -0.7085,0.58316667,0.68171429,0.681,2431,11/18/2020 10:48,female,1,1996,4 -0.909125,0.683625,0.83016667,1.16716667,2433,11/18/2020 10:54,male,1,2001,2 -0.56,1.225,0.61,0.635,2438,11/18/2020 11:08,male,1,2001,4 -0.729,0.881,0.7755,0.889875,2440,11/18/2020 11:20,male,1,2001,3 -0.7919,1.20883333,0.76977778,0.842,2441,11/18/2020 11:20,male,1,2001,3 -0.73884615,0.80785714,0.6255,0.90044444,2442,11/18/2020 11:27,male,1,2001,4 -0.974875,1.042125,0.80316667,0.8486,2450,11/18/2020 11:23,female,1,2000,2 -1.3562,1.39357143,1.27828571,1.7105,2453,11/18/2020 18:11,male,1,1967,2 -2.63066667,3.483,2.29833333,3.0575,2454,11/18/2020 18:42,male,1,1955,1 -1.02883333,0.78757143,0.86166667,0.85906667,2455,11/18/2020 18:59,female,1,1989,4 -0.8487,0.7465,1.09925,1.1764,2456,11/18/2020 20:25,female,0,1974,1 -0.85616667,0.658875,1.04222222,1.087,2457,11/19/2020 21:41,male,1,1995,3 -1.475125,1.1556,1.06328571,1.21925,2458,11/20/2020 14:22,female,1,2001,2 -0.67433333,0.7646,0.70416667,0.6035625,2460,11/22/2020 17:20,female,1,1996,4 -0.77771429,0.95055556,0.96781818,0.86733333,2461,11/23/2020 11:52,female,1,1991,4 -0.756,0.66216667,0.6935,0.72,2461,11/23/2020 11:53,female,1,1991,4 -0.77166667,0.645125,0.76076923,0.73085714,2463,11/23/2020 13:47,male,1,2001,3 -0.64664706,0.62745455,0.67,0.809875,2464,11/23/2020 13:30,male,1,1999,3 -0.58461538,0.7239,0.56092857,0.7078,2466,11/23/2020 13:50,male,1,2001,4 -0.60682353,0.54128571,0.58342857,0.67181818,2470,11/26/2020 8:11,male,1,1979,3 -1.15,1.72814286,1.22825,2.2508,2471,11/26/2020 8:30,male,1,1962,2 -0.53523529,0.73688889,0.62192308,0.6133,2472,11/26/2020 8:40,female,1,1993,3 -0.983,0.87733333,1.0184,1.101,2473,11/28/2020 11:03,male,1,2001,2 -1.542,1.5034,1.606,1.4716,2474,11/28/2020 11:13,female,1,2000,1 -0.5769375,0.50615385,0.66521429,0.52188889,2475,11/28/2020 11:22,male,1,2002,3 -0.558,0.47371429,0.53855556,0.475,2476,11/28/2020 11:31,male,1,1991,4 -0.57707143,0.47866667,0.5999,0.46455556,2477,11/28/2020 11:39,male,1,2001,3 -0.52014286,0.66755556,0.52927273,0.71436364,2478,11/29/2020 14:52,male,1,2001,3 -0.58142857,0.686,0.71388889,0.5625,2479,11/29/2020 15:03,male,1,2001,2 -0.6308,0.514,0.66258333,0.6431875,2482,11/28/2020 19:05,male,1,1993,3 -0.8467,1.4625,0.80009091,1.1568,2489,12/5/2020 13:47,male,1,1973,2 -2.89,1.9282,2.0415,1.80833333,2490,12/5/2020 14:01,female,1,1981,2 -0.84988889,0.87188889,0.79242857,0.80663636,2492,1/22/2021 15:42,male,1,2001,3 -2.16075,1.655,2.0345,1.855,2493,1/22/2021 16:07,female,1,1950,1 -1.2586,1.198125,1.4966,1.3178,2494,1/22/2021 16:38,female,1,1977,2 -1.592,1.74825,1.91125,1.80175,2495,1/22/2021 16:59,male,1,1968,2 -0.79071429,1.06975,0.88481818,0.85157143,2496,1/22/2021 17:19,male,1,1986,3 -2.041,2.634,1.81975,2.257,2497,1/22/2021 17:30,male,1,1945,1 -0.978625,0.948,1.16228571,1.09766667,2513,3/9/2021 14:39,female,1,1962,3 -1.50733333,1.5518,1.6852,1.748,2513,3/9/2021 14:02,female,1,1962,3 -1.10757143,0.94388889,1.08366667,1.09377778,2513,3/9/2021 14:30,female,1,1962,3 -0.9614,0.949125,0.88233333,1.00728571,2514,3/13/2021 20:51,male,1,1990,3 -0.6946,0.6655,0.8793,0.74216667,2515,3/13/2021 21:10,female,1,1977,2 -0.96642857,1.0675,1.15814286,1.43933333,2516,3/13/2021 21:22,male,1,1969,2 -1.16975,1.26933333,1.206,1.68883333,2517,3/13/2021 21:39,male,1,1960,1 -0.7972,0.93975,0.83533333,0.689,2530,4/19/2021 19:15,female,1,2000,3 -0.92833333,0.82333333,0.75333333,0.8998,2530,4/19/2021 19:15,female,1,2000,3 -0.79875,0.7436,0.62010526,0.7379,2531,4/12/2021 11:14,female,1,1999,3 -0.8156,0.758875,0.71885714,0.63175,2531,4/7/2021 13:48,female,1,1999,3 -0.692625,0.74930769,0.6694,0.68336364,2533,4/7/2021 10:37,female,1,2001,4 -0.6689,0.63623077,0.5905625,0.61633333,2533,4/8/2021 10:13,female,1,2001,4 -0.93325,0.77333333,0.85325,0.965,2535,4/7/2021 15:27,female,1,2001,3 -0.54525,0.7087,0.63188235,0.68925,2535,4/17/2021 18:26,female,1,2001,3 -0.69475,0.829,0.87033333,0.83033333,2535,4/7/2021 15:21,female,1,2001,3 -0.572,0.49022222,0.5115,0.49775,2536,4/7/2021 10:36,male,1,2001,4 -0.521,0.5086,0.54984615,0.54611111,2536,4/7/2021 10:37,male,1,2001,4 -0.8265,0.74718182,0.77177778,1.25866667,2538,4/7/2021 10:38,female,1,2000,3 -0.782,0.902,1.016625,1.4706,2539,4/7/2021 10:36,male,1,2001,3 -0.78963636,0.5945,0.9385,1.04166667,2539,4/7/2021 10:37,male,1,2001,3 -0.61522222,0.76328571,0.72961538,0.79181818,2540,4/15/2021 22:23,male,1,1999,3 -0.6905,0.66709091,0.8923,0.69777778,2540,4/7/2021 10:35,male,1,1999,3 -0.72428571,0.62845455,0.869,0.6878,2541,4/8/2021 15:20,female,1,2002,3 -0.66416667,0.58742857,0.796,0.7864,2541,4/8/2021 15:36,female,1,2002,3 -0.84092308,0.68827273,0.88783333,0.83785714,2542,4/17/2021 18:16,female,1,2001,4 -0.603,0.851,0.79585714,0.84614286,2542,4/17/2021 18:19,female,1,2001,4 -0.96077778,0.9336,1.6605,1.39966667,2542,4/7/2021 10:35,female,1,2001,4 -2.502,3.073,3.16433333,2.48666667,2544,4/13/2021 21:10,female,1,2001,3 -1.84333333,2.44233333,2.0635,2.3656,2544,4/13/2021 22:21,female,1,2001,3 -2.434,3.546,2.988,2.81033333,2544,4/13/2021 21:10,female,1,2001,3 -1.54925,2.41525,1.71066667,1.89725,2544,4/13/2021 22:22,female,1,2001,3 -0.9495,0.91971429,1.187,0.8866,2544,4/11/2021 16:15,female,1,2001,3 -1.9862,2.64966667,2.956,3.9375,2544,4/13/2021 21:41,female,1,2001,3 -0.750125,0.97722222,0.73966667,0.6815,2544,4/11/2021 16:16,female,1,2001,3 -1.7865,1.89857143,2.27,4.016,2544,4/13/2021 21:42,female,1,2001,3 -0.71836364,0.75855556,0.56341667,0.62676923,2545,4/7/2021 10:35,male,1,2001,5 -0.68166667,0.669,0.5825,0.732875,2545,4/8/2021 12:31,male,1,2001,5 -0.92877778,0.95557143,0.8588,0.82385714,2546,4/7/2021 10:40,female,1,2002,3 -0.66463636,0.919,0.72425,0.68488889,2546,4/7/2021 18:30,female,1,2002,3 -0.62792308,0.861,0.5186,0.7965,2547,4/20/2021 22:07,male,1,2001,1 -0.608875,0.5334,0.58007692,0.7074,2547,4/20/2021 22:07,male,1,2001,1 -1.2665,0.91666667,2.70425,1.1936,2549,4/7/2021 10:35,female,1,2001,3 -0.85642857,1.2882,1.27033333,1.158625,2549,4/17/2021 19:13,female,1,2001,3 -1.0794,0.89144444,1.9086,1.099,2549,4/17/2021 19:13,female,1,2001,3 -0.73892857,0.867875,1.07657143,0.9916,2550,4/20/2021 16:49,female,1,1998,3 -1.44933333,0.68854545,1.151,0.92571429,2550,4/7/2021 11:00,female,1,1998,3 -1.93333333,1.22,1.47985714,0.8738,2551,4/7/2021 10:52,female,0,2001,3 -1.17833333,0.96218182,0.80790909,0.80725,2551,4/7/2021 11:05,female,0,2001,3 -0.73644444,0.62538462,0.77725,0.727875,2552,4/19/2021 14:39,female,1,2001,3 -0.6775,0.618,0.77254545,0.91671429,2552,4/19/2021 14:29,female,1,2001,3 -6.823,6.373,4.993,4.0125,2554,4/7/2021 12:33,male,1,1946,1 -1.212,0.92166667,0.774,1.022,2555,4/7/2021 12:35,female,1,1972,3 -1.1845,0.9674,1.348,0.923,2555,4/7/2021 12:35,female,1,1972,3 -1.06257143,1.09342857,1.0526,1.20685714,2556,4/7/2021 14:20,female,1,2001,3 -0.805125,1.125125,0.821,1.02145455,2556,4/7/2021 14:30,female,1,2001,3 -1.408,1.7584,1.37042857,2.236,2557,4/7/2021 15:00,female,1,1973,2 -2.536,2.3885,1.83071429,1.5875,2557,4/7/2021 14:46,female,1,1973,2 -2.536,2.3885,1.83071429,1.5875,2557,4/7/2021 14:46,female,1,1973,2 -0.81333333,0.75445455,1.0305,0.93081818,2558,4/18/2021 22:57,male,1,2001,3 -0.8701,0.96042857,0.80857143,0.67038462,2558,4/18/2021 22:57,male,1,2001,3 -0.80842857,0.89677778,0.82655556,0.8269,2559,4/7/2021 15:56,female,1,2001,2 -0.935125,0.9785,0.8,0.95866667,2559,4/7/2021 15:39,female,1,2001,2 -0.732,0.75816667,0.71408333,0.46544444,2560,4/7/2021 15:49,male,1,1995,3 -0.7236,0.87,0.8415,0.84055556,2561,4/14/2021 23:25,male,0,2001,3 -0.759,0.9905,0.90741667,1.00966667,2561,4/7/2021 16:09,male,0,2001,3 -0.67357143,0.93485714,0.92444444,0.92672727,2561,4/7/2021 16:10,male,0,2001,3 -0.64671429,0.67975,0.7162,0.594,2562,4/18/2021 22:20,female,1,2001,3 -0.77475,0.63311765,0.78271429,0.61081818,2562,4/18/2021 22:21,female,1,2001,3 -0.77475,0.63311765,0.78271429,0.61081818,2562,4/18/2021 22:21,female,1,2001,3 -1.02225,1.044,0.952375,0.79966667,2564,4/7/2021 16:43,female,1,2001,4 -0.707,0.9186,0.79445455,0.76675,2564,4/7/2021 17:19,female,1,2001,4 -0.71773333,0.753125,0.728,0.6644,2565,4/7/2021 16:49,male,1,2002,4 -1.39966667,1.23228571,0.99466667,1.43025,2566,4/15/2021 10:18,female,1,1980,3 -0.90963636,1.21885714,0.962,1.206,2566,4/15/2021 10:19,female,1,1980,3 -1.39966667,1.23228571,0.99466667,1.43025,2566,4/15/2021 10:18,female,1,1980,3 -0.5825,0.7815,0.67166667,0.77591667,2571,4/7/2021 20:29,male,1,2001,3 -0.73933333,0.67928571,0.89042857,0.83742857,2571,4/7/2021 20:45,male,1,2001,3 -0.95442857,0.79436364,0.6386,0.7174,2573,4/7/2021 20:54,male,1,1968,3 -0.80622222,0.722,0.79755556,0.734,2573,4/7/2021 20:55,male,1,1968,3 -1.1115,1.21477778,1.027,1.0575,2574,4/7/2021 21:00,female,1,1998,3 -1.6016,1.08171429,1.051,1.12333333,2574,4/20/2021 21:05,female,1,1998,3 -3.981,2.0125,2.05666667,2.19566667,2575,4/7/2021 21:13,female,1,1968,2 -1.579,2.4104,1.28833333,1.49825,2575,4/7/2021 21:13,female,1,1968,2 -0.5681875,0.62178571,0.69277778,0.64455556,2576,4/7/2021 21:19,male,1,2000,3 -0.51673333,0.50871429,0.60957143,0.61377778,2576,4/7/2021 21:20,male,1,2000,3 -1.984,1.7918,1.60966667,1.674,2577,4/7/2021 21:34,male,0,1970,1 -1.16016667,1.1289,1.3385,1.22766667,2577,4/7/2021 21:34,male,0,1970,1 -0.66177778,0.5865,0.79969231,0.9504,2579,4/7/2021 21:48,male,1,1972,3 -0.6325,0.641,0.687875,0.88075,2579,4/7/2021 21:48,male,1,1972,3 -2.148,1.7765,1.7968,2.65933333,2580,4/8/2021 12:53,female,1,1954,2 -1.319,1.592,1.52685714,1.9132,2580,4/8/2021 12:54,female,1,1954,2 -1.555,1.01,1.18857143,1.00733333,2581,4/8/2021 13:36,female,1,1976,4 -1.4426,1.3695,2.01466667,1.376,2581,4/8/2021 13:34,female,1,1976,4 -1.133,1.962,1.018,0.893,2583,4/8/2021 14:43,female,1,1951,2 -0.6852,0.7754,0.8055,0.8295,2584,4/8/2021 15:16,female,0,1965,3 -0.503,0.753,0.811,0.61733333,2584,4/8/2021 15:16,female,0,1965,3 -0.605,0.7122,0.6582,0.70355556,2586,4/8/2021 15:30,male,0,1970,4 -0.62585714,0.6865,0.69238462,0.59663636,2586,4/8/2021 15:30,male,0,1970,4 -0.969,0.981,1.009,1.618,2587,4/8/2021 15:40,male,1,1970,3 -3.668,3.812,5.99,1.506,2588,4/8/2021 15:57,female,1,1950,1 -6.115,6.1735,2.624,2.6095,2588,4/8/2021 15:56,female,1,1950,1 -1.10125,1.09366667,1.34228571,1.538625,2589,4/8/2021 17:10,male,1,2001,4 -0.88792308,0.68533333,0.85133333,0.8448,2589,4/8/2021 17:27,male,1,2001,4 -0.70155556,0.821625,0.80428571,0.84392308,2590,4/8/2021 21:04,male,1,2001,1 -1.2615,1.0275,0.89188889,1.05411111,2590,4/8/2021 21:03,male,1,2001,1 -1.7975,1.52425,1.28155556,2.59,2591,4/8/2021 21:24,female,1,1976,1 -1.606,2.4162,0.8205,1.818,2591,4/8/2021 21:25,female,1,1976,1 -1.65025,1.6218,1.7214,1.38125,2592,4/8/2021 21:52,female,1,1958,1 -1.3812,1.5625,1.107,1.3779,2592,4/8/2021 21:51,female,1,1958,1 -1.0009,0.87585714,1.007,1.31225,2594,4/8/2021 22:36,male,1,1977,1 -0.996,0.7994,0.939375,1.1221,2594,4/8/2021 22:37,male,1,1977,1 -1.5775,1.5625,1.528,1.5245,2595,4/8/2021 23:04,female,1,1952,1 -1.63225,1.68816667,1.44725,2.17533333,2595,4/8/2021 23:03,female,1,1952,1 -0.85357143,1.1298,1.1438,1.0438,2597,4/8/2021 23:40,female,1,1980,4 -0.999125,0.8435,0.952,1.1265,2597,4/8/2021 23:40,female,1,1980,4 -0.7709,0.7825,0.842,0.63223077,2598,4/9/2021 14:26,female,1,2001,3 -0.95254545,0.69563636,0.8512,0.689375,2598,4/9/2021 13:46,female,1,2001,3 -1.04266667,1.357125,1.3754,1.3115,2599,4/17/2021 18:15,male,1,1977,2 -1.21116667,1.1524,1.3026,1.283,2599,4/21/2021 9:58,male,1,1977,2 -1.1372,1.442625,0.976375,1.11075,2600,4/9/2021 19:13,male,1,1970,3 -0.985,0.94633333,1.1535,1.03654545,2600,4/9/2021 19:15,male,1,1970,3 -1.1372,1.442625,0.976375,1.11075,2600,4/9/2021 19:13,male,1,1970,3 -0.6155,0.66466667,0.83833333,0.64233333,2601,4/18/2021 0:42,male,1,2001,3 -0.6155,0.66466667,0.83833333,0.64233333,2601,4/18/2021 0:42,male,1,2001,3 -1.31477778,1.06742857,1.253,0.968375,2601,4/9/2021 22:40,male,1,2001,3 -0.81375,0.886,0.7683,0.62683333,2601,4/13/2021 12:08,male,1,2001,3 -1.1735,1.504,1.13785714,1.788,2602,4/11/2021 10:31,male,1,1976,2 -2.14933333,1.51233333,1.7345,1.48075,2602,4/11/2021 10:32,male,1,1976,2 -3.662,3.3986,1.209,5.937,2603,4/11/2021 11:00,female,1,1977,2 -2.01133333,2.2285,2.566,2.037,2603,4/11/2021 11:00,female,1,1977,2 -1.482,1.534,1.4175,1.4905,2605,4/12/2021 11:19,female,1,1955,1 -1.7135,1.2284,1.05342857,1.2752,2605,4/12/2021 11:20,female,1,1955,1 -1.0368,1.587,1.0717,1.016875,2606,4/12/2021 11:46,male,1,1975,5 -0.80042857,1.191,0.628375,0.71230769,2606,4/12/2021 11:47,male,1,1975,5 -1.8215,1.5868,1.4914,1.605,2608,4/12/2021 14:16,female,1,1958,3 -1.6578,1.7302,1.74475,1.70766667,2608,4/12/2021 14:17,female,1,1958,3 -1.623,1.67375,1.4176,1.34475,2609,4/12/2021 14:33,male,1,1956,3 -1.71566667,1.87,1.47033333,1.7164,2609,4/12/2021 14:34,male,1,1956,3 -0.67990909,0.77728571,0.73922222,0.67073333,2610,4/12/2021 15:06,male,1,1979,2 -0.82411111,0.67890909,0.87616667,0.77408333,2610,4/12/2021 15:06,male,1,1979,2 -0.66433333,0.7336,0.7505,0.94533333,2611,4/12/2021 15:29,male,1,1964,3 -1.47157143,1.54233333,1.39716667,1.538,2612,4/12/2021 15:43,female,1,1956,3 -1.65383333,1.34385714,1.002,1.411,2612,4/12/2021 15:43,female,1,1956,3 -2.15366667,1.39933333,1.272,1.3316,2613,4/12/2021 16:36,female,1,1957,2 -1.41333333,1.34975,1.3755,1.60071429,2613,4/12/2021 16:35,female,1,1957,2 -1.37622222,1.16642857,1.231,1.1416,2614,4/12/2021 18:41,male,1,1973,4 -0.79928571,0.92163636,0.91466667,0.73957143,2614,4/12/2021 20:53,male,1,1973,4 -0.65,0.69933333,0.64316667,0.57014286,2615,4/12/2021 20:50,male,1,2001,4 -0.746,0.709,0.73458333,0.61333333,2615,4/12/2021 20:32,male,1,2001,4 -1.301,1.4565,1.551,1.28225,2616,4/12/2021 21:07,female,1,1981,2 -1.048625,1.24085714,1.2482,1.84633333,2616,4/12/2021 21:08,female,1,1981,2 -3.764,3.386,3.404,3.9925,2617,4/12/2021 21:31,male,1,1942,2 -2.895,2.6765,2.552,2.408,2617,4/12/2021 21:17,male,1,1942,2 -1.554,1.7966,1.475625,1.701,2618,4/12/2021 21:31,male,1,1948,1 -1.417,1.299,1.1795,1.56883333,2618,4/12/2021 21:32,male,1,1948,1 -2.26,1.621,2.25225,1.6154,2620,4/17/2021 23:15,male,1,1976,3 -1.9456,1.842,2.2886,1.628,2620,4/12/2021 21:40,male,1,1976,3 -1.60825,1.8102,1.7405,1.6915,2621,4/12/2021 22:00,male,1,1955,3 -1.4355,1.476375,1.47133333,1.60933333,2621,4/12/2021 22:01,male,1,1955,3 -0.91933333,0.8916,0.8868,1.06466667,2622,4/12/2021 22:59,male,1,2001,3 -0.899875,0.911,0.94858333,1.11166667,2622,4/12/2021 22:58,male,1,2001,3 -2.66175,1.26575,1.777,1.73516667,2623,4/13/2021 12:08,female,1,2001,2 -1.144,1.094,1.30425,0.92833333,2623,4/13/2021 12:20,female,1,2001,2 -2.69,3.22666667,2.9405,2.52575,2625,4/17/2021 23:06,female,1,1965,3 -4.778,6.587,5.9665,6.171,2625,4/13/2021 14:10,female,1,1965,3 -1.26266667,1.30625,1.4245,1.07371429,2626,4/13/2021 16:46,male,1,1996,3 -3.115,2.679,3.23966667,2.30066667,2627,4/13/2021 18:15,female,1,1949,1 -2.64125,2.142,2.2415,1.9284,2627,4/13/2021 18:16,female,1,1949,1 -1.57866667,2.057,1.7026,1.578,2628,4/13/2021 18:29,female,0,1957,2 -1.06728571,1.6205,1.693,1.1604,2628,4/13/2021 18:30,female,0,1957,2 -4.05,2.437,3.71666667,2.205,2629,4/13/2021 18:53,male,1,1941,1 -1.9645,2.1718,2.3542,1.692,2629,4/13/2021 18:54,male,1,1941,1 -1.4804,1.21333333,1.08316667,1.05075,2630,4/13/2021 22:40,female,1,1978,3 -0.894,0.97322222,1.06688889,0.8626,2630,4/13/2021 22:41,female,1,1978,3 -1.24814286,1.5505,1.53983333,1.394,2631,4/13/2021 22:09,male,1,1976,2 -0.93175,1.375375,0.99333333,0.87016667,2631,4/13/2021 22:11,male,1,1976,2 -0.961,1.11214286,1.291,1.01266667,2632,4/14/2021 23:04,male,1,1967,2 -0.799125,1.1615,1.1512,0.84816667,2632,4/14/2021 23:05,male,1,1967,2 -0.98166667,0.94314286,0.98511111,0.8117,2633,4/14/2021 20:52,female,1,1972,3 -0.80657143,0.93222222,0.78409091,0.69544444,2633,4/14/2021 20:52,female,1,1972,3 -0.97925,0.78084615,0.74636364,0.7482,2634,4/14/2021 22:32,male,1,1970,3 -0.70323077,0.65966667,0.76190909,0.834,2634,4/14/2021 22:33,male,1,1970,3 -1.64375,2.2245,1.672,1.527,2635,4/13/2021 20:42,male,1,1973,1 -2.983,3.504,3.81333333,3.513,2635,4/18/2021 17:50,male,1,1973,1 -1.08177778,0.92771429,1.10914286,0.93733333,2636,4/13/2021 21:14,male,1,1979,3 -1.00277778,1.11966667,1.54225,0.951625,2636,4/13/2021 21:14,male,1,1979,3 -1.811,1.747,1.5416,2.1178,2637,4/13/2021 22:04,female,1,1958,5 -1.624375,1.2915,1.05775,1.8045,2637,4/14/2021 12:04,female,1,1958,5 -1.385,1.62733333,1.639,1.98166667,2638,4/19/2021 0:22,male,1,1970,2 -1.65375,1.7152,1.77025,1.4404,2638,4/13/2021 23:27,male,1,1970,2 -1.48933333,1.41242857,1.6238,1.04657143,2639,4/13/2021 23:44,female,0,1971,4 -1.0116,0.98288889,0.99344444,0.868125,2639,4/18/2021 0:26,female,0,1971,4 -0.86275,1.077625,1.3296,0.9055,2640,4/14/2021 11:37,female,1,1974,3 -0.928,1.1946,1.11742857,0.92027273,2640,4/14/2021 11:37,female,1,1974,3 -1.14233333,1.07971429,1.30011111,0.99914286,2641,4/14/2021 11:49,male,1,1966,3 -0.77275,0.65788235,1.0314,1.05085714,2641,4/14/2021 11:49,male,1,1966,3 -1.293,1.15575,1.6225,0.95325,2641,4/14/2021 11:50,male,1,1966,3 -0.80063636,1.10285714,1.322,1.23316667,2643,4/14/2021 12:04,male,1,1964,3 -1.342,1.67975,2.28366667,1.1132,2644,4/14/2021 12:22,female,1,1971,3 -0.95066667,1.065,1.0035,0.9399,2644,4/14/2021 12:24,female,1,1971,3 -0.842875,0.90985714,0.90744444,0.78145455,2646,4/14/2021 12:41,female,1,1969,3 -0.951,0.90475,1.06371429,0.864875,2646,4/14/2021 12:41,female,1,1969,3 -2.113,2.00875,1.4608,1.80883333,2648,4/14/2021 12:59,male,1,1959,3 -1.7534,2.07666667,1.5895,1.779,2650,4/14/2021 13:19,female,1,1975,2 -1.96925,1.224,1.7014,1.50383333,2650,4/14/2021 13:20,female,1,1975,2 -0.83725,0.819625,0.85522222,0.79045455,2651,4/14/2021 14:08,male,1,2001,3 -0.7696,0.8588,1.0168,0.995875,2651,4/14/2021 14:46,male,1,2001,3 -0.7684,0.76288889,0.73922222,0.90185714,2651,4/20/2021 21:17,male,1,2001,3 -2.2945,2.27033333,2.192,2.851,2653,4/14/2021 13:41,female,1,1950,1 -5.265,4.5835,1.577,3.187,2653,4/14/2021 13:41,female,1,1950,1 -8.51,3.091,4.65,4.782,2654,4/14/2021 13:59,male,1,1951,1 -4.4715,4.497,5.8385,3.729,2654,4/14/2021 14:00,male,1,1951,1 -2.951,4.199,2.854,2.62,2655,4/14/2021 14:12,female,1,1960,1 -1.1225,1.06842857,1.5032,1.3265,2656,4/14/2021 15:01,female,1,1969,2 -0.8845,0.772875,0.9705,1.14444444,2656,4/14/2021 15:02,female,1,1969,2 -2.434,3.79733333,2.1815,1.8586,2657,4/14/2021 15:34,male,1,1973,3 -1.64025,1.70725,1.07888889,1.1715,2657,4/14/2021 15:36,male,1,1973,3 -1.61475,1.847,1.5205,1.4908,2658,4/20/2021 22:02,male,1,1970,3 -3.12433333,4.932,1.16233333,1.452,2658,4/20/2021 22:03,male,1,1970,3 -1.00142857,0.95333333,1.1675,1.00585714,2659,4/14/2021 16:02,male,1,1970,3 -0.91377778,0.7822,0.7161,0.827625,2659,4/14/2021 16:04,male,1,1970,3 -1.1925,1.484,1.642,1.4014,2660,4/14/2021 16:11,female,1,1978,3 -1.126,1.469,1.46185714,1.46566667,2660,4/14/2021 16:12,female,1,1978,3 -3.024,3.60333333,3.2565,4.2205,2662,4/14/2021 16:57,male,1,1946,1 -2.24633333,2.89833333,2.22375,2.2155,2662,4/14/2021 16:59,male,1,1946,1 -0.77683333,0.8775,0.769875,0.76454545,2663,4/18/2021 3:20,female,1,1970,2 -0.83669231,0.80322222,0.69742857,0.714,2663,4/18/2021 3:21,female,1,1970,2 -0.6845,0.6056,0.67445455,0.68,2665,4/14/2021 17:20,male,1,2001,4 -0.54745,0.548125,0.8522,0.66788889,2665,4/14/2021 17:21,male,1,2001,4 -0.7635,1.00641667,0.72109091,0.82983333,2666,4/18/2021 21:57,male,1,1960,2 -0.83983333,0.77536364,0.907,0.6023,2666,4/18/2021 21:58,male,1,1960,2 -0.65822222,1.041,1.28766667,1.18166667,2667,4/18/2021 2:50,male,1,1973,3 -1.17575,1.00875,0.619875,1.3578,2668,4/18/2021 21:46,female,1,1978,3 -0.9193,0.76964286,0.71233333,0.54416667,2668,4/18/2021 21:45,female,1,1978,3 -11.071,1.5505,1.19166667,1.2815,2669,4/17/2021 19:45,female,1,2001,3 -1.063875,1.32575,2.409,1.155,2669,4/17/2021 19:46,female,1,2001,3 -0.75744444,0.93957143,0.89781818,2.18333333,2670,4/14/2021 17:39,male,1,1968,3 -0.68688889,0.7554,0.7647,0.74972727,2670,4/14/2021 17:38,male,1,1968,3 -0.63878571,0.85754545,0.6805,0.682,2671,4/18/2021 21:16,female,1,1965,3 -0.801,0.67413333,1.058125,0.6513,2671,4/18/2021 21:16,female,1,1965,3 -0.70344444,0.69490909,0.874875,1.105875,2673,4/18/2021 22:09,female,1,1968,3 -0.65566667,0.90425,0.973,0.67236364,2673,4/18/2021 22:08,female,1,1968,3 -0.93858333,0.90571429,0.70307692,0.6314,2674,4/18/2021 3:06,male,1,1972,2 -0.72577778,1.15588889,0.9048,0.91244444,2674,4/18/2021 3:07,male,1,1972,2 -1.07185714,1.0002,0.85357143,1.1399,2675,4/14/2021 17:53,female,0,1975,3 -1.03666667,0.98375,1.2162,0.97557143,2675,4/14/2021 17:53,female,0,1975,3 -0.888,1.46283333,0.9355,0.8444,2676,4/17/2021 21:06,male,1,2003,3 -0.728875,0.9298,0.78418182,0.79428571,2676,4/17/2021 21:06,male,1,2003,3 -3.262,5.459,2.384,3.111,2677,4/14/2021 18:13,female,1,1943,1 -2.445,2.52766667,4.244,5.776,2677,4/14/2021 18:16,female,1,1943,1 -1.68,5.931,4.277,1.728,2677,4/14/2021 18:17,female,1,1943,1 -3.087,5.407,3.83166667,3.1355,2677,4/14/2021 18:12,female,1,1943,1 -1.11628571,1.3172,1.49733333,1.08166667,2678,4/14/2021 18:37,female,0,1981,2 -1.418,1.4915,1.43114286,1.21216667,2678,4/14/2021 18:36,female,0,1981,2 -1.328,1.397,1.60314286,1.6382,2679,4/14/2021 18:47,male,1,1976,3 -1.228,0.82975,1.3425,1.202,2679,4/14/2021 18:47,male,1,1976,3 -1.2325,1.57342857,1.80225,1.28975,2680,4/14/2021 19:06,female,1,1959,2 -1.42525,1.8855,2.447,2.1385,2680,4/14/2021 19:04,female,1,1959,2 -2.30875,2.375,2.251,2.461,2681,4/14/2021 19:01,male,1,1974,2 -1.66625,1.8435,2.6362,1.87466667,2681,4/14/2021 19:02,male,1,1974,2 -1.0855,0.93054545,1.1954,1.428,2682,4/14/2021 19:30,female,1,1980,2 -1.34683333,1.081,1.62175,1.5585,2682,4/14/2021 19:29,female,1,1980,2 -3.393,2.61725,2.54875,1.38266667,2683,4/14/2021 19:42,male,1,1976,2 -4.486,3.4395,2.061,4.88533333,2683,4/21/2021 10:34,male,1,1976,2 -3.273,2.81333333,1.965,1.51933333,2684,4/21/2021 10:49,female,1,1976,2 -1.625,1.643,1.38375,1.341,2684,4/14/2021 19:57,female,1,1976,2 -3.981,1.95233333,1.2365,1.119,2685,4/14/2021 20:02,female,1,1951,2 -1.61533333,2.12566667,1.81533333,1.045,2685,4/14/2021 20:03,female,1,1951,2 -2.883,3.19566667,2.9865,2.8085,2686,4/14/2021 20:08,female,1,1959,1 -2.804,4.036,3.965,3.4215,2686,4/14/2021 20:08,female,1,1959,1 -4.454,1.214,8.924,2.165,2688,4/21/2021 10:42,male,1,1979,2 -3.757,3.0395,3.08966667,2.392,2689,4/14/2021 20:28,male,1,1949,1 -5.472,3.806,5.449,2.93666667,2689,4/21/2021 17:23,male,1,1949,1 -1.5948,1.52525,1.56025,1.25166667,2690,4/20/2021 21:16,female,1,1977,5 -2.77925,1.08233333,2.12275,1.1565,2691,4/14/2021 20:39,female,1,1989,4 -1.8345,1.1408,2.188,1.9078,2691,4/14/2021 20:50,female,1,1989,4 -3.85,3.465,2.543,4.147,2692,4/22/2021 15:36,female,0,1971,2 -1.9085,2.3115,2.99525,1.43966667,2692,4/21/2021 17:08,female,0,1971,2 -1.43133333,1.353,3.54466667,2.49666667,2693,4/21/2021 17:20,male,1,1971,2 -2.97433333,2.5425,2.286,3.7985,2693,4/22/2021 19:07,male,1,1971,2 -2.60233333,2.324,2.89766667,6.213,2694,4/14/2021 21:04,female,1,1963,2 -6.455,6.886,6.183,7.553,2694,4/21/2021 17:32,female,1,1963,2 -8.826,4.134,4.038,5.21,2695,4/22/2021 18:56,male,1,1939,1 -1.71633333,2.5505,2.0895,1.134,2696,4/14/2021 21:41,male,1,1974,2 -1.114,1.92914286,1.94366667,1.0144,2696,4/14/2021 21:42,male,1,1974,2 -1.049125,1.17242857,1.1364,1.268,2697,4/15/2021 17:56,female,1,1949,1 -0.7535,1.08988889,0.95625,0.94878571,2697,4/15/2021 17:55,female,1,1949,1 -0.88822222,2.92,1.1278,1.3428,2698,4/16/2021 12:05,male,1,1948,1 -0.8243,0.9565,1.04011111,0.9995,2698,4/15/2021 18:04,male,1,1948,1 -0.89357143,0.941,1.4145,1.2785,2698,4/15/2021 18:05,male,1,1948,1 -0.82833333,1.19377778,1.01625,1.4015,2698,4/16/2021 12:04,male,1,1948,1 -1.3934,1.17183333,1.0275,1.621625,2699,4/15/2021 11:19,female,1,1955,1 -1.01311111,1.52533333,1.0345,1.235,2699,4/15/2021 17:47,female,1,1955,1 -2.1705,2.98225,2.029,1.74433333,2700,4/15/2021 11:38,female,1,1954,1 -2.848,2.696,4.413,2.543,2700,4/15/2021 11:37,female,1,1954,1 -2.627,1.644,4.1315,4.51,2701,4/15/2021 12:59,female,1,1961,1 -11.852,2.123,2.845,3.709,2701,4/15/2021 13:00,female,1,1961,1 -2.666,2.237,2.575,7.631,2703,4/15/2021 13:20,female,1,1959,1 -6.919,7.217,7.042,3.666,2703,4/15/2021 13:18,female,1,1959,1 -3.8505,1.866,1.13525,2.0558,2704,4/15/2021 13:29,male,1,1945,2 -2.169,4.607,2.644,1.6794,2704,4/15/2021 13:30,male,1,1945,2 -1.604,1.50628571,2.2,1.71125,2705,4/15/2021 14:19,male,1,1951,2 -1.3425,1.7685,1.4465,1.50133333,2705,4/15/2021 14:18,male,1,1951,2 -1.9105,1.61116667,1.338,1.82883333,2706,4/15/2021 14:31,female,1,1948,3 -1.21457143,1.6156,1.278,2.15,2706,4/15/2021 14:48,female,1,1948,3 -1.734,1.98475,1.911,1.874,2707,4/15/2021 15:11,male,1,1948,2 -2.17733333,1.74016667,2.00175,2.0875,2707,4/15/2021 15:10,male,1,1948,2 -0.98057143,0.9176,0.81488889,0.839,2708,4/15/2021 15:32,male,1,1970,5 -0.94171429,0.65407692,0.93775,0.7349,2708,4/15/2021 15:32,male,1,1970,5 -0.886,0.8992,1.176,1.3392,2709,4/15/2021 15:48,male,1,1962,2 -2.781,1.133,2.611,2.584,2709,4/15/2021 15:47,male,1,1962,2 -2.18925,2.356,1.17966667,1.27766667,2712,4/15/2021 16:04,female,1,1972,3 -0.9355,1.077,0.76615385,1.0528,2713,4/15/2021 16:03,female,1,1981,4 -0.92133333,0.70227273,0.72241667,1.11857143,2713,4/15/2021 16:04,female,1,1981,4 -7.15,3.3075,2.692,2.4535,2714,4/17/2021 20:08,female,1,1947,3 -2.291,2.64,3.34133333,2.628,2714,4/17/2021 20:08,female,1,1947,3 -1.48716667,1.90233333,1.99925,1.70525,2715,4/15/2021 16:18,female,1,1947,3 -2.611,1.5042,1.7215,1.82425,2715,4/15/2021 16:18,female,1,1947,3 -1.29416667,1.3815,1.1705,1.43771429,2717,4/15/2021 17:21,male,1,1971,2 -1.181,1.68533333,1.0624,2.4288,2717,4/15/2021 17:22,male,1,1971,2 -1.558,2.01633333,1.50566667,1.70683333,2718,4/15/2021 18:42,male,1,1972,3 -1.33628571,1.273,1.42275,1.305,2718,4/15/2021 18:42,male,1,1972,3 -1.25566667,1.175,1.1376,1.22966667,2719,4/15/2021 19:15,male,1,1970,2 -1.42028571,1.16671429,1.40075,1.119,2719,4/15/2021 19:15,male,1,1970,2 -1.3524,1.3165,1.33,1.19477778,2721,4/15/2021 19:37,male,1,1971,2 -1.30828571,1.57066667,1.22325,1.0366,2721,4/15/2021 19:37,male,1,1971,2 -3.004,2.7385,2.4374,1.4985,2722,4/15/2021 20:15,female,1,1956,2 -1.83866667,2.362,2.29166667,1.87725,2722,4/15/2021 20:16,female,1,1956,2 -1.49025,1.24771429,1.69633333,1.55033333,2723,4/15/2021 20:33,male,1,1959,2 -0.9972,1.2095,1.35814286,1.396,2723,4/15/2021 20:34,male,1,1959,2 -0.959,0.854125,1.32244444,0.9644,2724,4/15/2021 21:22,male,1,1971,4 -0.9965,0.7164,1.04433333,0.8282,2724,4/15/2021 21:22,male,1,1971,4 -2.894,3.259,1.11528571,2.7525,2725,4/15/2021 22:43,male,1,1952,2 -2.63966667,2.21,2.664,2.83766667,2725,4/15/2021 22:46,male,1,1952,2 -2.5915,2.994,4.385,3.355,2726,4/15/2021 23:14,female,0,1963,3 -1.9696,2.25033333,2.513,3.769,2726,4/15/2021 23:16,female,0,1963,3 -0.55836364,0.53661538,0.72123077,0.51757143,2727,4/16/2021 0:09,female,1,2002,3 -0.6135,0.603,1.055,0.5168,2727,4/16/2021 0:10,female,1,2002,3 -2.93,4.6145,3.6315,4.347,2729,4/16/2021 10:21,male,1,1955,1 -2.93,4.6145,3.6315,4.347,2729,4/16/2021 10:21,male,1,1955,1 -0.895,0.70481818,0.75192308,0.64908333,2730,4/20/2021 18:54,female,1,2001,3 -0.87028571,1.18642857,1.17242857,1.012,2730,4/16/2021 10:24,female,1,2001,3 -1.06375,0.95514286,1.15171429,0.86942857,2730,4/16/2021 10:37,female,1,2001,3 -1.8198,1.6282,1.7195,1.4562,2731,4/16/2021 10:48,male,1,1974,3 -1.925,1.8934,1.3805,1.09533333,2731,4/16/2021 11:05,male,1,1974,3 -1.85233333,1.34457143,1.92683333,1.5215,2732,4/16/2021 11:04,male,1,1959,3 -2.14233333,1.646,2.08,1.7282,2732,4/16/2021 11:03,male,1,1959,3 -6.087,2.838,1.96675,2.90833333,2734,4/16/2021 11:28,female,1,1959,2 -6.087,2.838,1.96675,2.90833333,2734,4/16/2021 11:28,female,1,1959,2 -2.234,2.684,2.5155,2.0876,2734,4/16/2021 11:29,female,1,1959,2 -1.4908,0.87383333,0.97116667,1.373125,2735,4/16/2021 11:41,male,1,1996,4 -0.692,0.55392308,0.75784615,0.61721429,2735,4/16/2021 11:49,male,1,1996,4 -0.96366667,0.8305,1.09383333,1.2385,2736,4/16/2021 12:15,male,1,1976,3 -0.833,1.0725,1.1636,1.2325,2736,4/16/2021 12:16,male,1,1976,3 -2.35,6.296,4.789,5.746,2737,4/16/2021 12:08,female,1,1954,1 -2.284,5.44,4.034,3.976,2737,4/16/2021 12:09,female,1,1954,1 -2.63,2.249,3.01,2.34675,2738,4/16/2021 17:20,female,1,1972,3 -2.075,1.81666667,1.87,1.76357143,2738,4/20/2021 18:23,female,1,1972,3 -0.697,0.81475,1.07028571,0.86363636,2740,4/16/2021 17:45,male,1,1967,3 -0.9312,1.118125,1.37528571,1.184,2740,4/20/2021 17:56,male,1,1967,3 -0.9405,1.718,1.8275,1.3036,2740,4/20/2021 17:57,male,1,1967,3 -0.9864,1.454,1.57488889,1.03633333,2742,4/16/2021 17:55,female,1,1966,2 -2.26,1.8336,1.58,1.18514286,2742,4/16/2021 17:53,female,1,1966,2 -2.05033333,1.834,2.15125,1.35475,2743,4/16/2021 19:23,male,1,1972,4 -1.12275,1.17,1.66633333,1.41,2743,4/16/2021 19:23,male,1,1972,4 -1.325,1.3534,1.30233333,1.38833333,2744,4/16/2021 19:33,male,1,1970,2 -3.04925,2.138,1.507,2.18216667,2744,4/16/2021 19:32,male,1,1970,2 -1.29671429,2.09825,1.4854,2.0195,2745,4/16/2021 19:41,female,1,1979,3 -1.05166667,1.179,1.4466,1.233125,2745,4/16/2021 19:42,female,1,1979,3 -1.1356,1.6176,1.66,1.919,2746,4/16/2021 20:06,female,1,1970,1 -3.58666667,1.715,2.1585,2.158,2746,4/16/2021 20:05,female,1,1970,1 -2.0805,1.853,1.593,1.65033333,2747,4/16/2021 20:26,male,1,1965,2 -0.9755,1.36333333,1.787,1.729,2747,4/20/2021 18:01,male,1,1965,2 -0.827,1.0235,0.79569231,0.8425,2748,4/20/2021 17:31,male,1,1997,4 -1.10942857,1.47383333,1.31025,1.25116667,2749,4/18/2021 14:18,female,1,1955,2 -0.929,1.17583333,1.17842857,0.89383333,2749,4/18/2021 14:19,female,1,1955,2 -1.37757143,1.24914286,1.0825,1.8052,2750,4/16/2021 21:01,female,1,1964,2 -1.0145,1.73,1.163,1.3424,2750,4/20/2021 18:12,female,1,1964,2 -0.900375,1.161875,0.9675,1.02816667,2751,4/16/2021 21:28,female,1,1968,2 -1.29433333,1.9975,2.54625,1.114,2751,4/20/2021 17:46,female,1,1968,2 -2.3198,2.39933333,2.8175,1.73733333,2753,4/17/2021 11:56,male,1,1970,3 -1.91075,2.786,1.9054,1.321,2753,4/20/2021 17:26,male,1,1970,3 -4.873,4.211,2.229,2.431,2754,4/17/2021 13:07,female,1,1952,2 -7.407,4.784,7.307,7.427,2754,4/17/2021 22:19,female,1,1952,2 -1.1394,1.20114286,0.87191667,1.24533333,2756,4/17/2021 13:10,female,1,1957,2 -1.1096,1.11188889,1.27716667,1.11966667,2756,4/17/2021 13:11,female,1,1957,2 -2.1605,4.643,3.72433333,2.099,2758,4/17/2021 13:27,female,1,1971,2 -2.0772,1.7975,2.34133333,2.46033333,2758,4/17/2021 22:11,female,1,1971,2 -2.1075,2.60333333,1.999,2.51233333,2759,4/17/2021 14:47,male,1,1968,2 -2.17275,2.2064,1.5685,1.977,2759,4/17/2021 14:48,male,1,1968,2 -0.72166667,0.70823077,0.74825,0.82111111,2760,4/17/2021 15:00,female,1,1945,1 -0.7519,0.65441667,0.7338,0.7046,2760,4/17/2021 15:00,female,1,1945,1 -2.08075,2.40866667,2.557,1.671,2761,4/20/2021 20:02,female,1,1951,1 -2.142,2.54233333,4.3875,2.92666667,2761,4/20/2021 20:03,female,1,1951,1 -1.28655556,0.98390909,1.2245,0.753,2763,4/17/2021 15:26,female,1,1979,4 -1.6254,0.54025,0.91254545,0.7754,2763,4/17/2021 15:27,female,1,1979,4 -1.559,1.37333333,1.3288,2.9365,2764,4/17/2021 15:30,female,1,1973,3 -1.2135,1.991,1.7935,2.317,2764,4/17/2021 15:30,female,1,1973,3 -0.91614286,0.73563636,0.8895,0.795,2765,4/17/2021 15:41,male,1,1968,3 -0.7672,0.7842,0.882875,1.13866667,2765,4/17/2021 15:42,male,1,1968,3 -1.65766667,1.67383333,1.62375,2.0355,2766,4/17/2021 15:48,male,1,1966,3 -1.362,1.199,1.89866667,1.990625,2766,4/17/2021 15:49,male,1,1966,3 -1.02328571,0.965,1.12975,1.078,2768,4/17/2021 16:03,male,1,1955,2 -0.963625,0.91814286,0.9725,1.09042857,2768,4/17/2021 16:04,male,1,1955,2 -0.91985714,0.71663636,0.704625,1.325,2769,4/17/2021 16:05,male,1,1998,2 -0.8388,0.58166667,0.75776923,0.983875,2769,4/17/2021 16:06,male,1,1998,2 -1.29842857,1.24814286,1.91525,1.33266667,2770,4/17/2021 17:17,male,1,1981,3 -1.00166667,1.15566667,1.82616667,1.171,2770,4/17/2021 17:18,male,1,1981,3 -1.74033333,1.536625,1.64875,1.15875,2771,4/17/2021 17:45,male,1,1964,3 -1.17775,1.849,1.40142857,0.95,2771,4/17/2021 17:46,male,1,1964,3 -1.3,1.65833333,1.4105,2,2772,4/17/2021 17:50,male,1,1950,2 -0.81066667,1.668,1.4684,1.59966667,2772,4/17/2021 17:51,male,1,1950,2 -1.2678,1.2155,1.41775,1.304,2773,4/17/2021 18:06,male,1,1970,2 -1.1415,1.00283333,1.03685714,0.78906667,2773,4/17/2021 18:07,male,1,1970,2 -0.87771429,1.0329,0.9281,0.9285,2774,4/17/2021 18:12,male,1,1959,3 -0.85166667,0.89175,0.76472727,0.9629,2774,4/17/2021 18:13,male,1,1959,3 -0.75966667,0.886,0.97175,0.90353846,2776,4/17/2021 18:20,male,1,1994,5 -0.76127273,0.776,0.81188889,0.71385714,2776,4/17/2021 18:21,male,1,1994,5 -2.2195,2.56775,2.46133333,2.542,2777,4/17/2021 18:28,female,1,1953,2 -1.39575,1.3525,1.932,2.4064,2777,4/17/2021 18:29,female,1,1953,2 -0.9098,1.03375,0.95055556,1.10057143,2778,4/17/2021 18:27,female,1,1968,2 -0.9562,0.6985,1.19025,1.2545,2778,4/17/2021 18:28,female,1,1968,2 -4.678,5.399,3.837,2.046,2779,4/17/2021 18:29,male,1,1951,2 -2.267,5.0535,5.3635,5.248,2779,4/21/2021 10:58,male,1,1951,2 -1.43466667,1.5015,1.21375,1.09711111,2780,4/17/2021 21:40,female,1,1982,2 -1.4276,1.506125,1.09566667,1.09766667,2780,4/17/2021 21:41,female,1,1982,2 -1.141125,1.23828571,1.025,1.221625,2781,4/17/2021 18:40,male,1,1978,3 -1.069625,1.06644444,0.9445,1.1286,2781,4/17/2021 18:40,male,1,1978,3 -4.534,3.05,4.488,3.317,2782,4/17/2021 18:43,female,1,1954,1 -3.5075,5.0265,3.955,2.925,2782,4/22/2021 16:21,female,1,1954,1 -2.28,2.503,1.9342,1.836,2783,4/17/2021 18:45,female,1,1955,2 -1.8405,1.6736,2.00766667,2.155,2783,4/17/2021 18:46,female,1,1955,2 -0.751,1.286,1.36166667,1.536,2784,4/17/2021 18:47,male,1,1973,2 -0.691,1.2925,0.9895,1.421,2784,4/17/2021 18:47,male,1,1973,2 -2.338,2.2775,2.61633333,1.9972,2785,4/17/2021 18:48,female,1,1976,2 -1.3562,3.3715,1.289,1.088625,2785,4/17/2021 18:48,female,1,1976,2 -3.98366667,3.112,3.834,3.21966667,2786,4/17/2021 19:27,male,1,1949,1 -3.094,2.732,3.175,1.84875,2786,4/17/2021 19:28,male,1,1949,1 -1.1256,1.07033333,0.6802,0.706,2788,4/17/2021 19:04,female,0,1980,4 -0.985,0.52516667,0.82333333,0.50571429,2788,4/17/2021 19:05,female,0,1980,4 -1.277,1.8,1.199,0.89,2789,4/17/2021 19:10,female,1,1979,3 -0.652875,0.73063636,0.743625,0.85066667,2791,4/17/2021 19:47,female,1,1998,3 -0.728875,0.561875,0.80008333,0.62533333,2791,4/17/2021 19:59,female,1,1998,3 -1.36633333,1.0995,1.16783333,1.18525,2791,4/17/2021 19:31,female,1,1998,3 -2.64025,2.07925,2.61966667,1.844,2792,4/17/2021 19:41,male,1,1956,3 -1.7756,1.7655,2.09025,2.07925,2792,4/17/2021 19:42,male,1,1956,3 -0.81483333,0.99083333,0.973125,0.9418,2793,4/17/2021 19:41,female,1,2001,3 -0.747,0.99385714,0.68108333,0.90075,2793,4/17/2021 20:12,female,1,2001,3 -1.21442857,1.49066667,1.42325,1.39875,2794,4/17/2021 19:31,female,1,1971,2 -1.262625,1.124,1.36742857,1.10625,2794,4/17/2021 19:32,female,1,1971,2 -0.6721,0.683375,0.834,0.982,2795,4/17/2021 19:40,male,1,1974,4 -0.65018182,0.75376923,0.736,1.04,2795,4/17/2021 19:41,male,1,1974,4 -1.0646,1.0548,1.06833333,0.85342857,2796,4/17/2021 19:43,female,1,1985,2 -0.4754,1.04255556,1.16966667,0.73366667,2796,4/21/2021 11:06,female,1,1985,2 -0.93333333,1.12833333,1.01685714,1.04025,2797,4/17/2021 19:50,male,1,1982,2 -0.6435,0.79272727,0.86169231,0.7975,2797,4/21/2021 11:11,male,1,1982,2 -2.946,1.7278,2.256,3.272,2798,4/17/2021 19:55,male,1,1960,2 -3.456,3.73866667,1.727,5.384,2798,4/17/2021 19:55,male,1,1960,2 -1.5085,2.7308,2.3415,2.1905,2799,4/17/2021 19:58,female,1,1950,2 -2.148,2.528,2.1525,3.4665,2799,4/21/2021 10:32,female,1,1950,2 -1.54666667,1.44857143,5.0335,1.12875,2800,4/17/2021 20:01,female,1,1978,1 -1.555,1.2606,1.48177778,1.17175,2800,4/17/2021 20:01,female,1,1978,1 -0.74683333,0.636625,1.065625,0.908375,2801,4/17/2021 20:07,female,1,1970,3 -0.605,0.96942857,0.74709091,1.014375,2801,4/21/2021 11:32,female,1,1970,3 -0.6383,0.569875,0.57545455,0.568,2802,4/20/2021 17:22,male,1,1999,4 -0.63257143,0.59933333,0.68575,0.59523529,2802,4/17/2021 20:16,male,1,1999,4 -0.662,0.58669231,0.59577778,0.62521429,2802,4/20/2021 17:20,male,1,1999,4 -4.518,1.399,1.45933333,1.7992,2803,4/17/2021 20:16,female,1,1974,3 -0.971,1.244,1.08,1.292,2803,4/17/2021 20:30,female,1,1974,3 -1.25,1.057,1.09414286,1.01055556,2805,4/17/2021 20:24,male,1,1975,2 -1.144,1.07775,1.43225,0.98214286,2805,4/17/2021 20:24,male,1,1975,2 -0.73085714,1.61666667,1.49766667,1.80133333,2806,4/17/2021 20:26,female,0,2003,3 -0.73922222,0.81,0.92835714,1.0134,2806,4/20/2021 20:07,female,0,2003,3 -1.2295,1.2395,1.21833333,1.229,2808,4/18/2021 10:06,male,1,1969,1 -1.075,1.26225,1.137,1.102375,2808,4/18/2021 10:07,male,1,1969,1 -1.10166667,1.19766667,1.42477778,1.2235,2809,4/17/2021 20:41,male,1,1968,3 -1.09685714,1.308,1.2964,0.97016667,2809,4/17/2021 20:42,male,1,1968,3 -1.10271429,1.17466667,1.30925,1.09777778,2810,4/17/2021 20:45,male,1,1970,3 -1.00091667,1.1245,0.93128571,1.31233333,2810,4/17/2021 21:00,male,1,1970,3 -1.51666667,1.29375,1.052,1.26842857,2811,4/17/2021 20:49,male,1,1965,3 -0.95428571,1.202,1.18116667,1.1904,2811,4/17/2021 20:57,male,1,1965,3 -1.3885,1.32466667,1.44925,1.87483333,2812,4/17/2021 21:32,female,1,1961,5 -1.0054,1.02633333,1.62428571,0.91375,2812,4/17/2021 21:33,female,1,1961,5 -2.11566667,2.6875,3.44666667,3.5585,2813,4/17/2021 21:50,male,1,1993,3 -1.3152,2.36775,1.66825,1.2824,2813,4/20/2021 17:41,male,1,1993,3 -0.96044444,1.15166667,1.05666667,1.442,2814,4/17/2021 22:03,male,1,1957,5 -1.17628571,1.1895,1.132,1.0298,2814,4/17/2021 22:04,male,1,1957,5 -1.8395,1.632,1.20244444,2.1726,2815,4/17/2021 22:08,female,1,1960,2 -1.20325,5.693,1.23775,1.1355,2815,4/17/2021 22:08,female,1,1960,2 -0.996,1.13057143,1.00325,1.43033333,2816,4/17/2021 22:55,female,1,1975,3 -0.915125,1.17516667,1.01733333,1.502,2816,4/17/2021 22:56,female,1,1975,3 -0.91325,1.08044444,1.09785714,0.91944444,2817,4/17/2021 22:55,female,1,1961,2 -0.8597,1.06357143,1.066375,0.90316667,2817,4/17/2021 22:56,female,1,1961,2 -1.4925,1.28516667,2.2505,2.17066667,2818,4/17/2021 23:28,male,1,1960,2 -3.341,3.738,2.077,2.853,2818,4/18/2021 3:15,male,1,1960,2 -1.0196,0.9673,1.19316667,0.997125,2819,4/19/2021 13:58,male,1,1980,3 -0.98175,1.14766667,1.082125,0.939,2819,4/19/2021 13:59,male,1,1980,3 -0.73975,0.70885714,0.808,0.916,2821,4/18/2021 10:43,male,1,2006,2 -1.008,0.66281818,0.75333333,0.7703,2821,4/18/2021 10:44,male,1,2006,2 -0.81222222,0.70858333,0.838375,0.82455556,2822,4/18/2021 11:05,female,1,1997,3 -0.66241176,0.61944444,0.958625,0.66325,2822,4/18/2021 11:13,female,1,1997,3 -0.84483333,0.96033333,1.13144444,1.032875,2823,4/18/2021 11:25,male,1,2002,2 -0.66911111,0.6245,0.95885714,0.948,2823,4/18/2021 11:25,male,1,2002,2 -0.83342857,1.00257143,0.87716667,1.08475,2824,4/21/2021 0:45,female,1,2001,3 -0.89225,1.3832,0.74713333,0.932,2824,4/21/2021 1:09,female,1,2001,3 -2.5655,2.1965,1.73625,2.547,2824,4/21/2021 11:57,female,1,2001,3 -1.5148,1.503375,1.26033333,1.61175,2824,4/21/2021 12:29,female,1,2001,3 -1.6364,1.44,1.34933333,1.41071429,2824,4/21/2021 12:59,female,1,2001,3 -0.87442857,0.69815385,0.72716667,0.9775,2824,4/18/2021 11:36,female,1,2001,3 -0.8017,0.805875,0.75244444,0.78345455,2824,4/21/2021 0:46,female,1,2001,3 -0.798,0.813875,1.7558,1.11833333,2824,4/21/2021 1:10,female,1,2001,3 -1.82266667,1.8995,1.64233333,2.2162,2824,4/21/2021 11:58,female,1,2001,3 -1.57625,1.32866667,1.53975,1.8604,2824,4/21/2021 12:30,female,1,2001,3 -1.36,1.216,1.42416667,1.225375,2824,4/21/2021 12:59,female,1,2001,3 -0.74928571,0.6776,0.64933333,0.68244444,2824,4/18/2021 11:37,female,1,2001,3 -0.764875,1.0299,0.69481818,0.80642857,2824,4/21/2021 1:01,female,1,2001,3 -1.20333333,1.2255,1.07022222,1.090375,2824,4/21/2021 11:32,female,1,2001,3 -1.544,1.6976,1.5022,1.556,2824,4/21/2021 12:16,female,1,2001,3 -1.513,1.56175,1.86566667,2.058,2824,4/21/2021 12:44,female,1,2001,3 -0.9954,0.79466667,1.0386,0.81881818,2824,4/18/2021 13:48,female,1,2001,3 -0.74341667,0.66288889,0.68481818,0.64281818,2824,4/21/2021 1:01,female,1,2001,3 -1.40483333,1.47857143,1.07725,1.10483333,2824,4/21/2021 11:33,female,1,2001,3 -1.333,1.388,1.42275,1.3054,2824,4/21/2021 12:17,female,1,2001,3 -2.085,1.72328571,1.662,1.30125,2824,4/21/2021 12:45,female,1,2001,3 -0.64155556,0.65122222,0.7835,0.99008333,2824,4/18/2021 13:49,female,1,2001,3 -0.67411111,1.06777778,0.6711,0.99257143,2825,4/18/2021 12:17,female,1,2001,3 -0.62488889,0.7786,0.7662,1.061,2825,4/18/2021 12:18,female,1,2001,3 -1.58425,1.389,1.5544,1.7076,2826,4/18/2021 13:18,male,1,1972,2 -1.093,1.36225,2.4962,1.513,2826,4/18/2021 13:29,male,1,1972,2 -0.82266667,0.62738462,0.91,0.57507143,2828,4/18/2021 13:32,male,1,2001,4 -0.855,0.54307692,0.80921429,0.52990909,2828,4/18/2021 13:50,male,1,2001,4 -0.69977778,0.69975,0.94263636,0.8828,2829,4/18/2021 13:39,male,1,2001,3 -0.72855556,0.74788889,0.89585714,0.82925,2829,4/21/2021 11:37,male,1,2001,3 -1.186625,1.3444,1.2005,1.2648,2830,4/18/2021 13:45,female,1,1976,2 -1.33128571,1.297,1.32071429,1.2005,2830,4/18/2021 13:56,female,1,1976,2 -2.29325,4.3135,3.553,2.60066667,2831,4/18/2021 13:47,female,1,1962,3 -1.18611111,1.824,1.3195,1.3464,2831,4/18/2021 13:48,female,1,1962,3 -0.625,0.57285714,0.77375,0.85766667,2832,4/18/2021 13:47,male,1,2000,3 -0.628,0.63246667,0.8785,0.82214286,2832,4/21/2021 11:43,male,1,2000,3 -0.778875,0.79153333,0.68671429,0.76544444,2833,4/18/2021 14:05,female,1,1964,3 -0.90661538,0.76914286,0.868,0.7354,2833,4/18/2021 14:16,female,1,1964,3 -1.32825,1.37233333,1.292,1.314,2835,4/18/2021 14:15,female,1,1964,2 -1.4858,1.54933333,1.45257143,1.28983333,2835,4/18/2021 14:16,female,1,1964,2 -1.252,2.3655,1.50133333,1.716875,2836,4/18/2021 14:25,male,1,1960,2 -2.467,1.20571429,2.2838,1.17633333,2837,4/18/2021 14:29,female,1,1975,3 -1.184125,1.04971429,1.187,0.923,2837,4/18/2021 14:30,female,1,1975,3 -0.79428571,0.8137,0.7412,0.90525,2838,4/18/2021 14:47,male,1,1969,3 -0.81016667,0.7330625,0.99366667,0.921,2838,4/18/2021 14:37,male,1,1969,3 -1.15875,1.20266667,1.2857,1.221,2840,4/18/2021 14:49,female,1,1945,2 -1.1766,2.07775,1.12325,1.294375,2840,4/18/2021 14:50,female,1,1945,2 -1.46025,1.9372,1.4995,0.96683333,2841,4/18/2021 14:59,male,1,1970,3 -1.766,1.51133333,1.84125,1.3732,2841,4/18/2021 14:58,male,1,1970,3 -3.3808,0.844,2.358,4.519,2842,4/18/2021 14:50,female,1,1956,1 -2.4768,3.3555,2.20166667,1.552,2842,4/18/2021 14:50,female,1,1956,1 -1.50266667,1.727,1.33866667,1.7414,2843,4/18/2021 15:07,male,1,1968,2 -1.73166667,2.13675,1.98825,2.34,2843,4/18/2021 15:06,male,1,1968,2 -0.93,0.62315385,0.73091667,0.9285,2844,4/18/2021 14:58,female,1,1969,3 -0.59773333,0.7775,0.99033333,0.78166667,2844,4/18/2021 14:58,female,1,1969,3 -1.48825,1.83133333,1.6478,1.62133333,2845,4/18/2021 15:15,male,1,1968,2 -1.768,1.645,1.4725,1.738,2845,4/18/2021 15:15,male,1,1968,2 -1.142125,1.17322222,1.157,1.0358,2846,4/18/2021 15:19,male,1,1968,1 -1.06945455,1.047,1.26366667,1.10533333,2846,4/18/2021 15:20,male,1,1968,1 -1.00833333,0.84377778,1.084,0.79236364,2847,4/18/2021 15:48,female,1,2001,3 -0.79661538,0.62122222,1.02557143,0.771,2847,4/18/2021 15:49,female,1,2001,3 -1.153,1.024,1.0466,1.15871429,2847,4/18/2021 15:50,female,1,2001,3 -0.62772727,0.60808333,0.71833333,0.55083333,2848,4/18/2021 16:30,male,1,1977,5 -0.75725,0.60077778,0.66985714,0.5234,2848,4/18/2021 16:31,male,1,1977,5 -1.22171429,1.11757143,1.37825,1.04328571,2849,4/18/2021 16:32,female,1,1976,2 -1.12266667,1.4662,1.8048,1.231,2849,4/18/2021 16:35,female,1,1976,2 -0.59516667,0.58744444,0.698,0.6457,2851,4/18/2021 16:58,male,1,1979,5 -0.6195,0.62077778,0.80214286,0.62715385,2851,4/18/2021 21:20,male,1,1979,5 -1.8725,1.8725,1.6555,1.41183333,2853,4/18/2021 17:10,male,1,1975,2 -1.305,1.6505,1.616,2.03233333,2853,4/18/2021 17:11,male,1,1975,2 -0.92733333,1.2437,0.92542857,1.22675,2854,4/18/2021 17:21,female,1,2001,3 -0.6995,0.98225,1.10042857,0.77236364,2854,4/18/2021 17:35,female,1,2001,3 -1.7126,2.858,1.716125,1.516,2855,4/18/2021 17:23,male,1,1958,2 -1.5948,2.20466667,2.16925,2.00266667,2855,4/18/2021 17:23,male,1,1958,2 -0.93133333,1.0245,0.69992857,0.8351,2856,4/18/2021 17:18,female,1,1998,3 -0.813,0.9535,0.84566667,0.837,2856,4/18/2021 17:19,female,1,1998,3 -0.7995,1.0318,0.88444444,2.04775,2857,4/18/2021 17:21,female,1,2001,3 -0.7854,1.029125,0.85275,0.86075,2857,4/18/2021 17:35,female,1,2001,3 -0.6937,0.6835,0.60955556,0.90088889,2858,4/18/2021 17:30,male,1,1980,5 -0.9635,0.814875,1.12657143,0.76485714,2858,4/18/2021 21:18,male,1,1980,5 -1.7805,1.719,1.876,2.115,2859,4/18/2021 17:34,female,1,1973,3 -0.88966667,1.04914286,0.88,1.2495,2859,4/18/2021 17:35,female,1,1973,3 -5.195,4.0465,3.577,4.0905,2860,4/18/2021 17:37,male,1,1954,1 -2.984,2.59625,2.657,2.21266667,2860,4/18/2021 17:38,male,1,1954,1 -3.19233333,2.6445,2.632,3.086,2861,4/18/2021 18:00,female,1,1958,2 -2.708,2.704,3.341,3.5725,2861,4/18/2021 20:33,female,1,1958,2 -1.22671429,1.26416667,1.16516667,0.90571429,2862,4/18/2021 18:17,male,1,1966,2 -0.847625,1.01575,0.92657143,1.050625,2862,4/18/2021 18:18,male,1,1966,2 -1.2,1.4265,1.317,2.1235,2863,4/18/2021 18:17,female,1,1974,2 -1.42675,1.17214286,1.02085714,1.6902,2863,4/18/2021 18:18,female,1,1974,2 -0.82111111,0.90927273,0.8388,0.96525,2865,4/18/2021 18:20,female,1,2000,4 -0.58092857,0.625,0.60915385,0.51616667,2865,4/18/2021 18:30,female,1,2000,4 -0.60845455,0.67809091,0.7065,0.62485714,2865,4/18/2021 18:31,female,1,2000,4 -0.60845455,0.67809091,0.7065,0.62485714,2865,4/18/2021 18:31,female,1,2000,4 -0.980375,0.83011111,0.8835,0.99655556,2866,4/18/2021 18:29,female,1,1974,5 -0.7789,0.88458333,0.780125,0.87233333,2866,4/18/2021 18:29,female,1,1974,5 -0.8274,1.31866667,0.91511111,0.97355556,2867,4/18/2021 18:34,female,1,1976,2 -0.83028571,0.96566667,0.7951,0.77161538,2867,4/18/2021 18:34,female,1,1976,2 -1.26483333,1.0735,0.96066667,1.48866667,2868,4/18/2021 18:34,male,1,1966,2 -1.00225,1.204,1.145,1.252,2868,4/18/2021 18:34,male,1,1966,2 -2.657,2.165,2.1234,2.0615,2869,4/18/2021 18:50,male,1,1953,1 -2.18933333,1.646,2.77425,1.1645,2869,4/18/2021 18:51,male,1,1953,1 -0.78444444,0.95555556,0.8811,0.8085,2870,4/18/2021 18:52,female,1,1990,4 -0.7897,0.69775,0.71788889,0.7207,2870,4/18/2021 18:52,female,1,1990,4 -1.51383333,1.6744,0.7778,1.70025,2871,4/18/2021 18:52,female,1,1939,1 -1.17633333,1.472,1.19325,1.241,2871,4/18/2021 18:52,female,1,1939,1 -2.842,2.81633333,2.69266667,2.9095,2872,4/18/2021 18:52,female,1,1949,1 -1.98566667,2.45333333,2.739,1.8695,2872,4/18/2021 18:53,female,1,1949,1 -0.9336,0.90022222,0.9158,0.7678,2873,4/18/2021 19:09,male,1,1987,3 -1.5058,0.54336364,1.085,0.81457143,2873,4/18/2021 19:09,male,1,1987,3 -1.5966,1.824,1.62325,1.0855,2874,4/18/2021 19:42,male,1,1969,3 -1.6478,1.5288,1.189,1.1008,2874,4/18/2021 19:43,male,1,1969,3 -2.687,2.3535,1.89525,3.156,2875,4/18/2021 19:46,female,1,1954,2 -2.3155,2.58,1.9248,2.376,2875,4/18/2021 19:47,female,1,1954,2 -2.3996,3.40633333,2.082,2.647,2876,4/18/2021 20:00,female,1,1953,1 -5.713,4.122,1.456,2.129,2876,4/18/2021 20:00,female,1,1953,1 -1.399,2.388,1.778,2.282,2877,4/18/2021 20:00,female,1,1977,3 -2.953,1.08225,1.55533333,2.00966667,2877,4/18/2021 20:16,female,1,1977,3 -3.518,4.534,2.832,3.99866667,2878,4/18/2021 20:17,female,1,1953,1 -3.199,2.8106,2.812,2.446,2878,4/18/2021 20:18,female,1,1953,1 -1.42966667,1.35366667,1.51066667,1.8035,2881,4/18/2021 20:25,female,1,1958,1 -2.484,1.4535,1.707,2.45966667,2882,4/18/2021 20:32,female,1,1972,2 -1.87,1.289,1.58733333,1.24866667,2882,4/18/2021 20:32,female,1,1972,2 -1.278,2.395,1.70825,1.76275,2883,4/18/2021 20:36,male,1,1951,2 -2.0625,3.25175,3.607,2.44366667,2883,4/21/2021 10:39,male,1,1951,2 -2.19066667,2.85366667,2.016,2.102,2884,4/18/2021 20:44,male,1,1957,2 -2.5565,1.57516667,1.8925,1.54733333,2884,4/18/2021 20:43,male,1,1957,2 -0.65807143,0.56888889,0.8758,0.70266667,2885,4/18/2021 20:38,male,1,1979,4 -0.57325,0.7306,0.5975,0.5562,2885,4/18/2021 20:39,male,1,1979,4 -1.69025,3.392,3.0355,2.6864,2886,4/21/2021 10:45,male,1,1954,2 -2.443,2.431,1.7985,1.74033333,2886,4/18/2021 20:44,male,1,1954,2 -1.1695,1.29266667,1.33475,1.11014286,2887,4/18/2021 20:50,male,1,1959,2 -1.06333333,1.14325,1.10566667,1.1006,2887,4/18/2021 20:51,male,1,1959,2 -4.638,3.08533333,2.0245,2.74075,2888,4/21/2021 10:52,male,1,1957,2 -1.956,3.526,2.19,1.64933333,2888,4/18/2021 20:51,male,1,1957,2 -2.31866667,2.293,2.3835,2.08966667,2889,4/18/2021 20:59,female,1,1958,2 -1.46528571,1.38833333,1.675,1.64,2889,4/21/2021 10:59,female,1,1958,2 -0.974,1.234,0.964,0.838,2890,4/18/2021 21:12,male,1,1973,3 -1.71133333,1.956,1.137,1.49233333,2890,4/18/2021 21:11,male,1,1973,3 -1.60633333,1.7384,1.4015,1.474,2892,4/18/2021 21:34,female,1,1975,2 -2.0425,1.452,1.6905,1.588,2892,4/18/2021 21:35,female,1,1975,2 -0.76676923,0.80433333,0.88428571,0.8108,2893,4/21/2021 10:50,male,1,1976,4 -0.8248,0.8901,1.929,0.913625,2893,4/18/2021 22:13,male,1,1976,4 -4.009,1.10533333,1.189,1.657,2894,4/18/2021 22:07,male,1,1970,3 -1.293,0.758,0.867,1.048,2894,4/18/2021 22:07,male,1,1970,3 -0.96588889,0.931375,0.84475,1.04483333,2895,4/18/2021 22:08,male,1,2000,3 -0.98825,1.0586,0.88527273,1.26125,2895,4/18/2021 22:07,male,1,2000,3 -2.0634,1.60433333,1.421,1.509,2896,4/18/2021 22:33,female,1,1970,2 -1.42566667,1.35616667,1.5092,1.26357143,2896,4/18/2021 22:34,female,1,1970,2 -1.17588889,1.577,1.2255,1.6412,2897,4/18/2021 23:08,male,1,1945,2 -1.22016667,1.168125,1.3594,1.376,2897,4/18/2021 23:07,male,1,1945,2 -1.09842857,1.1574,1.8175,0.95655556,2898,4/18/2021 23:16,female,1,1985,3 -0.9034,1.1715,1.56883333,1.245375,2898,4/18/2021 23:18,female,1,1985,3 -0.8095,1.02557143,0.86116667,0.8549,2899,4/21/2021 11:16,male,1,1996,5 -0.99766667,2.57675,0.95883333,1.2985,2899,4/19/2021 15:01,male,1,1996,5 -0.749,0.607,0.56964706,0.58475,2900,4/19/2021 0:27,male,1,1977,3 -0.673125,0.8562,1.16516667,0.70257143,2900,4/19/2021 0:21,male,1,1977,3 -2.3885,2.108,3.386,2.6894,2901,4/19/2021 0:43,male,1,1958,2 -0.8425,0.78842857,1.203,1.53766667,2901,4/19/2021 0:57,male,1,1958,2 -0.6815,0.913875,0.6764,0.787125,2902,4/19/2021 0:43,female,1,1999,4 -0.924,1.02725,0.875,0.80728571,2902,4/19/2021 0:42,female,1,1999,4 -1.28171429,1.01425,1.4205,1.099,2903,4/19/2021 14:24,male,1,1962,2 -0.99118182,1.0862,1.01814286,0.93783333,2905,4/19/2021 9:30,female,1,1980,3 -0.96742857,1.04145455,1.014,0.976,2905,4/19/2021 9:30,female,1,1980,3 -2.2028,2.008,2.08033333,1.8145,2906,4/19/2021 9:52,female,1,1953,1 -2.27266667,2.41033333,2.09666667,2.0435,2906,4/19/2021 9:53,female,1,1953,1 -2.3535,1.573,2.02125,2.122,2907,4/19/2021 10:44,male,1,1953,2 -1.90333333,2.43633333,1.90266667,2.241,2907,4/19/2021 10:45,male,1,1953,2 -1.1044,1.40166667,1.0015,1.32444444,2908,4/19/2021 11:28,female,1,2001,3 -1.01642857,0.90883333,0.879625,1.08766667,2908,4/19/2021 11:29,female,1,2001,3 -1.42666667,1.2916,1.3282,1.36125,2909,4/19/2021 11:30,female,1,1960,2 -1.3402,1.283,1.5188,1.23725,2909,4/19/2021 11:30,female,1,1960,2 -2.1995,3.063,3.43466667,2.515,2910,4/19/2021 11:50,male,1,1948,2 -2.288,2.323,2.70825,2.33575,2910,4/19/2021 11:51,male,1,1948,2 -0.942,0.9985,0.870625,1.11922222,2911,4/19/2021 11:53,male,1,1975,3 -1.59966667,1.43425,1.992,1.6536,2912,4/19/2021 12:13,male,1,1957,3 -1.014,1.15625,1.8654,1.1586,2912,4/19/2021 12:10,male,1,1957,3 -3.577,1.9168,1.49316667,1.678,2913,4/19/2021 12:14,female,1,1977,1 -1.363,1.185,1.224125,1.306,2913,4/19/2021 12:15,female,1,1977,1 -4.88,4.64,4.0715,4.344,2914,4/19/2021 12:37,female,1,1948,2 -7.466,6.432,2.963,8.745,2914,4/19/2021 12:36,female,1,1948,2 -0.8144,0.9915,0.81666667,0.83622222,2915,4/19/2021 12:45,male,1,1960,5 -0.886875,1.01233333,1.121375,0.89636364,2915,4/19/2021 12:50,male,1,1960,5 -0.64242857,0.59858333,0.980625,0.643,2916,4/19/2021 12:55,female,0,1950,1 -0.65091667,0.6642,0.90811111,0.81575,2916,4/19/2021 12:55,female,0,1950,1 -8.573,2.688,4.005,2.131,2917,4/19/2021 13:04,female,1,1951,1 -3.08766667,1.7945,2.66433333,2.286,2917,4/19/2021 13:05,female,1,1951,1 -1.1145,1.161,1.20475,1.46325,2919,4/19/2021 13:15,female,1,1971,3 -1.9544,1.85216667,1.951,2.391,2919,4/19/2021 13:13,female,1,1971,3 -0.7543,0.569,0.93733333,0.78176923,2920,4/19/2021 13:20,female,1,1999,2 -0.6913,0.53685714,0.81925,0.5834,2920,4/19/2021 13:21,female,1,1999,2 -4.33066667,1.3255,3.4215,3.1195,2921,4/19/2021 13:25,male,1,1950,1 -4.522,3.40433333,3.86,2.889,2921,4/19/2021 13:25,male,1,1950,1 -1.813,1.96233333,2.657,2.1615,2922,4/19/2021 13:20,female,1,1959,3 -2.14225,2.457,2.246,3.436,2922,4/19/2021 13:21,female,1,1959,3 -1.436,1.4365,1.45266667,1.776,2923,4/19/2021 13:34,female,1,1971,3 -1.619,2.02033333,2.0474,2.02033333,2923,4/19/2021 13:33,female,1,1971,3 -0.69283333,0.65015385,0.6315,0.6747,2924,4/19/2021 13:37,male,1,2002,2 -0.64925,0.64625,0.6785,0.57728571,2924,4/19/2021 13:38,male,1,2002,2 -1.04833333,0.81227273,1.0186,0.90457143,2925,4/19/2021 13:42,male,1,1960,4 -0.98857143,1.0273,0.95825,0.917,2925,4/19/2021 13:41,male,1,1960,4 -2.266,0.94966667,1.5268,1.0618,2926,4/19/2021 13:42,male,1,1997,5 -0.6215,1.02383333,0.9096,0.68885714,2927,4/19/2021 16:26,male,1,1969,4 -0.67966667,0.62336364,0.6764,0.55392857,2927,4/19/2021 16:27,male,1,1969,4 -1.3608,1.20128571,1.4764,1.81525,2928,4/19/2021 13:56,female,1,1960,2 -1.343,1.5035,1.49183333,1.4475,2928,4/19/2021 13:57,female,1,1960,2 -5.9605,5.927,6.14,3.065,2929,4/19/2021 14:09,male,0,1948,2 -6.1085,4.2815,2.493,5.951,2929,4/19/2021 14:10,male,0,1948,2 -1.31866667,1.51575,1.7402,1.618,2930,4/19/2021 14:16,female,1,1955,2 -1.55033333,1.3616,1.292,1.23366667,2930,4/19/2021 14:17,female,1,1955,2 -1.05583333,0.9906,1.28528571,1.29814286,2931,4/19/2021 14:12,female,1,1959,2 -1.054125,0.9762,1.234,1.116,2931,4/19/2021 14:12,female,1,1959,2 -1.437,0.97357143,0.99622222,0.99,2932,4/19/2021 14:13,female,1,1971,3 -0.87871429,1.03633333,0.93122222,1.26128571,2932,4/19/2021 14:14,female,1,1971,3 -1.09,1.006375,1.173,1.15828571,2934,4/19/2021 14:27,male,1,1956,2 -1.11775,1.064,1.05733333,1.07425,2934,4/19/2021 14:29,male,1,1956,2 -1.564,1.73575,1.56166667,1.62857143,2937,4/19/2021 19:25,female,1,1959,2 -1.21566667,1.867,1.801,1.80983333,2937,4/19/2021 19:26,female,1,1959,2 -2.0835,1.20785714,1.127,0.823,2938,4/19/2021 14:45,female,1,2001,3 -0.97528571,1.05657143,0.89883333,0.81225,2938,4/19/2021 14:46,female,1,2001,3 -3.252,2.6426,1.215,3.933,2939,4/19/2021 14:49,female,1,1949,1 -2.22633333,2.4844,2.11466667,2.2725,2939,4/21/2021 13:38,female,1,1949,1 -1.0935,1.21942857,1.21466667,1.14133333,2940,4/19/2021 14:50,male,1,1958,2 -0.984,0.9905,1.05575,1.04083333,2940,4/19/2021 14:51,male,1,1958,2 -1.058,1.03828571,1.23625,1.1166,2941,4/19/2021 15:06,female,1,1957,2 -0.9965,1.098,1.13642857,1.15871429,2941,4/19/2021 15:07,female,1,1957,2 -1.99025,2.297,2.12533333,2.12875,2942,4/19/2021 15:15,female,1,1949,1 -1.08933333,1.4106,1.3816,1.20985714,2942,4/21/2021 21:35,female,1,1949,1 -1.50133333,1.32628571,2.807,1.4085,2943,4/19/2021 15:18,female,1,1971,2 -2.35025,1.611,1.13066667,1.2882,2943,4/19/2021 15:18,female,1,1971,2 -1.2265,1.38733333,1.1802,1.32116667,2944,4/19/2021 15:30,female,1,1969,3 -0.917,0.9995,0.80663636,1.06428571,2944,4/19/2021 15:31,female,1,1969,3 -0.58045455,0.65414286,0.728375,0.763,2945,4/19/2021 16:56,male,1,1977,5 -0.6235,0.64954545,0.732,0.697125,2945,4/19/2021 16:57,male,1,1977,5 -0.95966667,1.20242857,1.4834,1.318,2946,4/19/2021 15:47,male,1,1971,3 -1.41733333,1.13666667,1.6888,0.9173,2946,4/19/2021 15:47,male,1,1971,3 -1.56825,1.823,1.82433333,1.27128571,2947,4/19/2021 15:48,male,1,1966,2 -1.25825,1.24625,1.36042857,2.441,2947,4/19/2021 15:49,male,1,1966,2 -3.834,3.245,2.9,3.83033333,2949,4/19/2021 16:05,male,1,1945,1 -2.663,3.5295,4.5625,3.791,2949,4/19/2021 16:06,male,1,1945,1 -2.36733333,2.90533333,2.8675,1.95375,2950,4/19/2021 16:04,female,1,1947,1 -2.135,2.703,2.923,3.03633333,2950,4/19/2021 16:05,female,1,1947,1 -1.374125,1.1582,0.8912,1.3024,2951,4/19/2021 16:09,female,0,1975,2 -1.34533333,1.0615,0.851,1.21114286,2951,4/19/2021 16:10,female,0,1975,2 -0.854625,0.64666667,0.63078947,0.72785714,2952,4/20/2021 14:42,female,1,2001,3 -5.103,1.95925,2.704,2.152,2953,4/19/2021 16:42,male,1,1941,1 -1.33183333,1.330875,3.6,1.4516,2953,4/19/2021 16:43,male,1,1941,1 -0.759,0.6929,0.94308333,0.644125,2954,4/19/2021 16:43,female,1,2001,3 -0.93657143,0.66530769,0.92644444,0.85442857,2954,4/19/2021 16:34,female,1,2001,3 -1.6276,1.64933333,1.3735,1.41825,2955,4/19/2021 18:18,female,1,1965,2 -1.52,1.755,1.8735,1.9125,2955,4/19/2021 18:19,female,1,1965,2 -0.64244444,0.6179,0.76890909,0.87027273,2957,4/19/2021 16:53,male,1,1998,4 -0.56133333,0.48290909,0.77358333,0.67491667,2957,4/19/2021 17:00,male,1,1998,4 -1.6976,3.00733333,1.53325,2.1405,2958,4/19/2021 17:14,female,1,1945,2 -1.3392,1.96025,1.976,1.82042857,2958,4/19/2021 17:14,female,1,1945,2 -5.083,3.282,2.4312,4.567,2959,4/19/2021 17:18,male,1,1956,1 -1.6515,2.545,1.6552,2.9455,2959,4/20/2021 21:12,male,1,1956,1 -2.933,3.91875,3.576,3.288,2960,4/19/2021 17:33,female,1,1960,1 -2.795,2.72725,2.7345,2.852,2960,4/20/2021 20:54,female,1,1960,1 -1.6104,1.65575,2.35433333,2.424,2961,4/19/2021 17:31,male,1,1942,2 -1.48725,1.39525,1.497,1.468,2961,4/19/2021 17:31,male,1,1942,2 -0.6248,0.92766667,0.73833333,0.92633333,2963,4/19/2021 17:33,male,1,2001,3 -0.56407143,0.71553333,0.6772,0.85411111,2963,4/19/2021 17:34,male,1,2001,3 -0.9305,1.5485,2.04125,0.988,2964,4/19/2021 17:49,female,1,2001,3 -1.074,1.08455556,2.7315,0.763,2964,4/19/2021 17:50,female,1,2001,3 -3.73833333,2.55066667,1.975,4.04,2965,4/19/2021 17:48,female,1,1950,1 -2.5835,2.3335,2.6315,1.61125,2965,4/19/2021 17:49,female,1,1950,1 -1.3652,1.225625,1.2474,1.12333333,2966,4/19/2021 18:56,female,1,1978,2 -0.9629,0.96883333,0.8705,1.26957143,2966,4/21/2021 10:38,female,1,1978,2 -0.9618,0.92225,0.8185,1.05228571,2967,4/19/2021 17:59,female,1,1969,4 -0.691,0.78228571,0.627,0.80175,2967,4/19/2021 18:00,female,1,1969,4 -0.685,0.70352941,0.95766667,0.77366667,2968,4/19/2021 18:05,female,1,2000,3 -0.93827273,0.96666667,0.65677778,0.902625,2968,4/19/2021 18:06,female,1,2000,3 -0.4832,0.607,0.50252941,0.49461111,2969,4/19/2021 18:28,male,1,2000,2 -0.591,0.63230769,0.5298,0.5735625,2969,4/19/2021 18:07,male,1,2000,2 -0.5635,0.61271429,0.61563636,0.4615,2969,4/19/2021 18:25,male,1,2000,2 -0.876375,1.15866667,0.94466667,0.89528571,2970,4/19/2021 18:10,male,1,1974,5 -0.79828571,0.76875,1.58957143,1.761,2970,4/19/2021 18:11,male,1,1974,5 -1.08381818,1.176,1.1936,1.0925,2972,4/19/2021 18:18,male,1,1965,3 -1.1278,1.223,1.183,1.149625,2972,4/19/2021 18:18,male,1,1965,3 -1.46475,1.47083333,1.9042,1.32675,2973,4/19/2021 18:36,female,1,1999,2 -1.1425,1.20525,1.8208,1.455,2973,4/19/2021 18:37,female,1,1999,2 -0.65177778,0.64193333,0.63425,0.68876923,2974,4/19/2021 18:40,male,1,1976,2 -0.5395,0.7351,0.60381818,0.745,2974,4/19/2021 18:35,male,1,1976,2 -0.5906,0.46413333,0.5615,0.600875,2975,4/19/2021 18:39,male,1,1993,5 -0.652,0.47633333,0.74525,0.523,2975,4/19/2021 18:39,male,1,1993,5 -1.066,1.30728571,1.0625,1.2912,2976,4/19/2021 18:44,male,1,1977,3 -0.93083333,1.23433333,1.13642857,1.00566667,2976,4/19/2021 18:44,male,1,1977,3 -0.67525,0.8035,0.9235,0.66471429,2977,4/19/2021 18:48,male,1,1975,2 -1.08522222,1.0134,1.0765,1.0555,2978,4/19/2021 18:53,male,1,1971,3 -1.036,1.07,1.00185714,1.02163636,2978,4/19/2021 18:53,male,1,1971,3 -0.757375,0.73375,0.62736364,0.69909091,2979,4/19/2021 19:04,male,1,1998,5 -0.66073333,0.718,0.7911,0.6227,2979,4/19/2021 19:05,male,1,1998,5 -1.222,0.82766667,1.127,1.2185,2981,4/19/2021 19:27,female,1,1952,1 -2.28466667,1.2805,2.879,1.6465,2981,4/19/2021 19:29,female,1,1952,1 -0.876,0.90377778,0.90944444,0.85685714,2983,4/19/2021 19:31,female,1,1975,3 -0.97111111,0.9705,0.99642857,1.0766,2983,4/19/2021 19:32,female,1,1975,3 -3.3005,3.926,4.4585,4.4575,2984,4/19/2021 19:33,male,1,1957,1 -2.759,3.185,3.413,2.8275,2984,4/19/2021 19:35,male,1,1957,1 -2.15725,1.54333333,2.0125,2.02275,2986,4/19/2021 19:46,male,1,1943,2 -1.807,1.84933333,1.83116667,1.69925,2986,4/19/2021 19:46,male,1,1943,2 -1.807,1.84933333,1.83116667,1.69925,2986,4/19/2021 19:46,male,1,1943,2 -3.059,2.1995,2.2165,1.909,2987,4/19/2021 20:19,male,1,1958,2 -1.59,1.7844,1.938,1.6034,2987,4/19/2021 20:18,male,1,1958,2 -0.857875,0.8472,1.22944444,0.97266667,2988,4/19/2021 20:14,male,1,1999,3 -1.1575,0.97875,1.12057143,1.21344444,2988,4/19/2021 20:15,male,1,1999,3 -1.05771429,2.716,1.1904,1.093,2989,4/19/2021 20:48,male,1,1951,4 -1.3104,1.6456,1.1415,1.24616667,2989,4/19/2021 20:47,male,1,1951,4 -1.83966667,3.357,2.154,2.1384,2990,4/19/2021 21:04,male,1,1959,2 -2.921,2.53433333,2.0725,2.56733333,2990,4/19/2021 21:05,male,1,1959,2 -2.729,2.475,2.532,2.883,2991,4/19/2021 21:39,male,1,1960,2 -1.71,2.066,3.068,2.464,2991,4/19/2021 21:39,male,1,1960,2 -0.74385714,0.793875,1.207125,0.94277778,2992,4/19/2021 21:44,male,1,2002,4 -0.80483333,0.82571429,0.5427,0.81554545,2992,4/19/2021 21:45,male,1,2002,4 -1.414,3.47966667,2.095,1.789,2993,4/20/2021 0:23,female,1,1962,2 -3.022,3.183,1.875,3.07466667,2993,4/20/2021 0:15,female,1,1962,2 -1.58325,1.738,2.1585,1.6956,2994,4/19/2021 22:04,male,1,1930,2 -1.48328571,1.8468,1.672,1.60425,2994,4/19/2021 22:04,male,1,1930,2 -0.76325,1.0785,0.8375,1.2982,2995,4/19/2021 22:38,female,1,1953,2 -0.82341667,1.2072,1.04555556,1.0525,2995,4/19/2021 22:35,female,1,1953,2 -0.705,0.9295,0.81675,1.496,2996,4/19/2021 22:56,female,1,1945,3 -0.777,1.0915,0.96075,1.19025,2997,4/19/2021 23:12,female,1,2001,3 -1.147,1.479,1.121,0.903,2997,4/19/2021 22:59,female,1,2001,3 -1.24,1.07533333,1.51183333,1.318,2997,4/19/2021 23:11,female,1,2001,3 -1.023,0.79622222,0.78366667,2.0114,2998,4/19/2021 23:46,female,0,1955,1 -0.75914286,1.046625,0.82622222,1.19485714,2998,4/19/2021 23:48,female,0,1955,1 -0.96355556,0.80928571,1.36185714,0.933,2999,4/19/2021 23:43,male,1,1973,3 -0.78063636,1.03383333,1.05466667,0.8816,2999,4/19/2021 23:43,male,1,1973,3 -1.54716667,1.12466667,1.09,1.942,3000,4/20/2021 0:34,female,1,2001,3 -0.79553846,1.07711111,1.0558,0.6935,3000,4/20/2021 0:42,female,1,2001,3 -1.2682,1.17666667,1.21854545,1.2964,3001,4/20/2021 0:50,male,0,1958,3 -1.0492,1.08972727,1.26125,1.472,3001,4/20/2021 0:49,male,0,1958,3 -0.76214286,0.5675,0.77288889,0.8392,3002,4/20/2021 0:51,female,1,1975,3 -0.692,0.562,0.788,1.016,3002,4/20/2021 0:52,female,1,1975,3 -1.13214286,1.36,1.36675,0.83066667,3003,4/20/2021 1:00,male,1,1972,2 -1.305,1.31485714,1.324,1.226,3003,4/20/2021 0:52,male,1,1972,2 -2.69533333,2.93,2.968,3.10366667,3004,4/20/2021 1:08,female,1,1958,2 -1.56,1.53075,1.73442857,1.912,3004,4/20/2021 1:09,female,1,1958,2 -1.5564,1.432,1.5828,1.84233333,3005,4/20/2021 1:21,male,1,1965,3 -2.017,1.5225,1.8065,1.8135,3005,4/20/2021 1:19,male,1,1965,3 -0.622,0.6339,0.76741667,0.60933333,3006,4/20/2021 1:11,male,1,1970,4 -0.5466875,0.53927273,0.698,0.5302,3006,4/20/2021 1:12,male,1,1970,4 -1.17911111,1.19342857,1.4095,0.9875,3007,4/20/2021 1:20,female,1,1976,2 -0.77527273,0.87175,0.92688889,0.76357143,3007,4/20/2021 1:12,female,1,1976,2 -3.57633333,3.459,6.516,4.0095,3009,4/20/2021 1:26,male,1,1955,1 -3.05066667,3.6875,3.7665,4.248,3009,4/20/2021 1:27,male,1,1955,1 -0.718,0.7457,1.04477778,0.84742857,3011,4/20/2021 1:33,female,1,1964,2 -1.3457,0.843,0.7666,1.20628571,3011,4/20/2021 1:34,female,1,1964,2 -1.666,1.356,1.52385714,1.36483333,3012,4/20/2021 1:45,male,1,1958,1 -0.98125,1.2055,1.38,1.1456,3012,4/20/2021 1:46,male,1,1958,1 -0.64184615,0.7775,0.7475,0.67761538,3013,4/20/2021 1:35,male,1,1970,3 -0.58442857,0.73057143,0.8898,0.57561538,3013,4/20/2021 1:35,male,1,1970,3 -0.79390909,0.89242857,1.15914286,0.77214286,3015,4/20/2021 1:49,female,1,1968,2 -0.8634,1.239375,1.59016667,1.40975,3015,4/20/2021 1:50,female,1,1968,2 -1.80825,1.783,1.37725,1.36966667,3016,4/20/2021 2:52,female,1,1959,1 -2.188,2.1225,2.0305,2.66633333,3016,4/20/2021 2:50,female,1,1959,1 -1.5272,1.38633333,1.9755,1.37575,3016,4/20/2021 2:51,female,1,1959,1 -1.06014286,0.878375,0.79608333,0.721,3017,4/20/2021 2:09,male,1,1962,3 -0.758,1.037625,1.2121,0.867,3017,4/20/2021 2:10,male,1,1962,3 -1.501,2.93633333,2.123,2.047,3018,4/20/2021 2:46,female,1,1947,1 -1.54525,1.808,1.57166667,1.6774,3019,4/20/2021 3:00,female,1,1945,1 -1.325,2.85266667,1.1665,1.227,3019,4/20/2021 3:00,female,1,1945,1 -4.15,3.9555,3.74466667,2.802,3020,4/20/2021 3:16,male,1,1945,1 -1.282,3.185,5.0105,2.67933333,3020,4/20/2021 3:17,male,1,1945,1 -0.75727273,0.7646,0.69477778,0.6795,3021,4/20/2021 3:29,female,1,1970,2 -0.8344,1.15355556,0.98209091,0.742,3021,4/20/2021 3:30,female,1,1970,2 -0.80590909,0.66426667,0.6993,0.67566667,3022,4/20/2021 3:45,male,1,1999,4 -1.00942857,1.33077778,0.6675,0.63109091,3022,4/20/2021 3:45,male,1,1999,4 -1.073,0.9995,0.96166667,1.006625,3023,4/20/2021 11:19,male,1,1977,3 -0.955625,0.98288889,0.978625,1.0686,3023,4/20/2021 11:20,male,1,1977,3 -0.711,0.892,0.61644444,0.874,3024,4/20/2021 9:29,female,1,1980,4 -0.75933333,0.935,0.61933333,0.648,3024,4/20/2021 9:29,female,1,1980,4 -0.6892,0.8678,0.6284,0.7205,3025,4/20/2021 10:07,male,1,1978,4 -0.80544444,0.7104,0.63590909,0.8912,3025,4/20/2021 10:08,male,1,1978,4 -0.58890909,0.64944444,0.61825,0.69607143,3026,4/20/2021 10:35,female,1,1978,4 -0.70742857,0.6511,0.55769231,0.70035714,3026,4/20/2021 10:40,female,1,1978,4 -0.79753333,0.6779,0.69685714,0.6334,3027,4/20/2021 11:01,male,1,1974,4 -0.572,0.69514286,0.71914286,0.7645,3027,4/20/2021 11:04,male,1,1974,4 -0.77244444,0.73333333,0.77676923,0.9645,3028,4/20/2021 11:50,female,1,1949,3 -0.86233333,0.89011111,0.8324,0.8485,3028,4/20/2021 11:50,female,1,1949,3 -0.95366667,1.07085714,0.79045455,0.951,3029,4/20/2021 12:08,female,1,1946,3 -0.70492308,0.7638,0.75544444,0.86671429,3029,4/20/2021 12:09,female,1,1946,3 -0.84627273,1.2495,0.94157143,0.8988,3030,4/20/2021 12:24,male,1,1952,3 -0.8788,1.46071429,0.851,0.94733333,3030,4/20/2021 12:24,male,1,1952,3 -2.62175,3.167,2.38466667,2.444,3031,4/20/2021 10:06,female,1,1943,1 -3.0178,2.901,2.2105,2.84,3031,4/20/2021 10:08,female,1,1943,1 -0.68122222,0.62566667,0.8767,0.74083333,3032,4/20/2021 10:27,female,1,2002,3 -0.67772727,0.6216,0.576,0.66618182,3032,4/20/2021 10:28,female,1,2002,3 -1.698,2.18033333,1.69716667,2.125,3033,4/20/2021 10:52,male,1,1959,2 -1.6305,2.0982,1.85425,1.90425,3033,4/20/2021 10:52,male,1,1959,2 -1.585,1.4864,1.9674,1.66825,3034,4/20/2021 11:11,female,1,1960,2 -1.658,1.29342857,1.3636,1.32,3034,4/20/2021 11:12,female,1,1960,2 -2.96,3.272,3.233,2.882,3035,4/20/2021 11:14,female,1,1948,2 -2.986,5.661,3.5835,3.748,3035,4/20/2021 11:14,female,1,1948,2 -2.29375,2.714,1.836,1.9545,3036,4/20/2021 11:18,female,1,1964,2 -1.397,1.691,1.63733333,1.61925,3036,4/20/2021 11:32,female,1,1964,2 -0.59333333,0.55582353,0.668,0.72616667,3037,4/20/2021 11:28,male,1,1979,4 -0.78114286,0.945125,0.67771429,0.70354545,3037,4/20/2021 11:28,male,1,1979,4 -0.947,1.068,0.861625,0.85311111,3038,4/20/2021 12:50,female,1,1954,2 -1.12466667,0.971,0.926,0.865,3038,4/20/2021 12:51,female,1,1954,2 -1.18025,1.0214,1.064,1.15671429,3039,4/20/2021 11:27,male,1,1970,2 -1.0795,1.2622,1.19088889,1.3385,3039,4/20/2021 11:27,male,1,1970,2 -0.95211111,0.904875,0.834,1.26528571,3040,4/20/2021 12:39,male,1,1953,2 -1.0608,0.95066667,0.914875,0.86133333,3040,4/20/2021 12:39,male,1,1953,2 -1.4834,1.98333333,1.25428571,1.4866,3041,4/20/2021 11:39,female,1,2002,3 -0.9908,1.29057143,1.069,0.98622222,3041,4/20/2021 11:40,female,1,2002,3 -1.79475,1.8605,1.703,1.92933333,3042,4/20/2021 11:46,male,1,1957,2 -1.641,1.5738,2.14675,1.81166667,3042,4/20/2021 11:47,male,1,1957,2 -1.321,1.31066667,1.11685714,1.387875,3043,4/20/2021 11:51,female,1,1979,5 -1.2865,0.9948,1.08854545,0.90175,3043,4/20/2021 11:52,female,1,1979,5 -0.674375,0.58773333,0.677,0.78071429,3044,4/20/2021 11:51,female,1,1973,2 -0.65666667,0.79575,0.77291667,0.8647,3044,4/20/2021 11:52,female,1,1973,2 -0.83630769,1.009,0.676,0.85242857,3045,4/20/2021 11:50,female,1,1979,3 -0.9875,0.90214286,0.82577778,0.89518182,3045,4/20/2021 12:02,female,1,1979,3 -0.8085,1.07875,1.01385714,1.363,3046,4/20/2021 12:18,female,1,1960,2 -1.1564,1.369,1.33944444,1.359,3046,4/20/2021 12:25,female,1,1960,2 -1.6975,1.7928,1.63225,1.49075,3047,4/20/2021 12:24,male,1,1957,3 -1.5965,1.50966667,1.561,1.53683333,3047,4/20/2021 12:26,male,1,1957,3 -2.052,2.03666667,1.57,1.306,3048,4/20/2021 12:27,female,1,1958,2 -1.14,1.929,3.582,2.0415,3048,4/20/2021 12:28,female,1,1958,2 -0.56876923,0.9672,0.63566667,0.90011111,3049,4/20/2021 12:26,male,1,1990,3 -0.55866667,0.6435,0.82966667,0.776,3049,4/20/2021 12:28,male,1,1990,3 -1.3414,1.5244,1.23063636,0.7055,3050,4/20/2021 12:56,female,1,2001,3 -0.78688889,1.04514286,0.606,1.11088889,3050,4/20/2021 12:57,female,1,2001,3 -4.7385,3.04933333,3.1575,2.214,3051,4/20/2021 12:42,female,1,1969,2 -2.0542,3.027,1.74925,1.7348,3051,4/20/2021 12:51,female,1,1969,2 -0.60246667,0.9438,0.64013333,0.629,3052,4/20/2021 12:50,male,1,1969,3 -0.58927273,0.75575,0.653,0.56894118,3052,4/20/2021 12:50,male,1,1969,3 -0.68657143,0.801,0.80033333,0.73228571,3053,4/20/2021 12:52,female,1,1996,3 -0.59655556,0.83188889,0.8039,1.05925,3054,4/20/2021 13:11,female,1,1989,3 -0.727,0.58691667,0.62936364,0.7164,3054,4/20/2021 13:12,female,1,1989,3 -0.795,1.2218,0.947375,1.392875,3055,4/20/2021 13:13,male,1,1981,2 -1.816,0.99411111,0.95822222,1.2935,3055,4/20/2021 13:12,male,1,1981,2 -4.1605,4.2025,2.047,1.5975,3056,4/20/2021 13:17,male,1,1956,2 -0.55890909,0.67083333,0.537625,0.548,3057,4/20/2021 14:01,male,1,1972,2 -0.71544444,0.6259,0.48714286,0.55694444,3057,4/20/2021 14:02,male,1,1972,2 -2.21333333,1.60733333,1.40971429,1.5872,3058,4/20/2021 13:27,male,1,1977,3 -1.448,1.66525,1.1998,1.88566667,3058,4/20/2021 13:26,male,1,1977,3 -2.21333333,1.60733333,1.40971429,1.5872,3058,4/20/2021 13:27,male,1,1977,3 -2.21333333,1.60733333,1.40971429,1.5872,3058,4/20/2021 13:27,male,1,1977,3 -1.62283333,2.00975,1.44766667,1.6895,3059,4/20/2021 13:41,male,1,1950,2 -2.15783333,1.82125,1.9245,1.84866667,3059,4/20/2021 14:03,male,1,1950,2 -3.997,3.163,3.069,3.7915,3060,4/20/2021 14:03,female,1,1959,1 -5.31633333,4.831,3.86,4.247,3060,4/20/2021 13:53,female,1,1959,1 -0.81863636,1.0782,0.79361538,0.81233333,3062,4/20/2021 14:30,female,1,1971,2 -0.7746,0.5388,0.64772727,0.9293,3063,4/20/2021 14:14,male,1,1999,3 -0.59,0.9025,0.68655556,1.248,3063,4/20/2021 14:15,male,1,1999,3 -1.1168,1.0954,0.9985,1.3008,3064,4/20/2021 14:17,female,1,1965,2 -1.10622222,0.9485,0.77816667,0.76428571,3064,4/20/2021 14:25,female,1,1965,2 -0.5475,0.568,0.67076923,0.60633333,3065,4/20/2021 14:21,female,1,1968,2 -0.6066,0.532,0.68755556,0.62277778,3065,4/20/2021 14:22,female,1,1968,2 -2.723,2.2048,2.765,1.6565,3066,4/20/2021 14:20,female,1,1957,2 -1.68775,2.469,2.31566667,2.50733333,3066,4/20/2021 14:21,female,1,1957,2 -1.1287,1.068,1.2515,1.49233333,3067,4/20/2021 14:26,male,1,1948,1 -1.06933333,1.77575,2.45866667,1.907,3067,4/20/2021 14:42,male,1,1948,1 -2.22225,1.6545,2.373,2.901,3068,4/20/2021 14:31,male,1,1947,1 -2.68525,2.19533333,2.009,2.14233333,3068,4/20/2021 14:34,male,1,1947,1 -2.5475,3.03133333,2.181,2.1464,3069,4/20/2021 14:46,male,1,1940,1 -2.392,2.904,2.2715,2.3115,3069,4/20/2021 14:46,male,1,1940,1 -3.15733333,3.0995,3.0425,2.744,3070,4/20/2021 14:47,female,1,1956,1 -3.632,3.4765,3.072,3.377,3070,4/20/2021 14:48,female,1,1956,1 -1.932,1.9652,1.851,2.171,3071,4/20/2021 14:46,male,1,1980,3 -1.5335,1.94271429,1.286,1.8115,3071,4/20/2021 14:47,male,1,1980,3 -1.142,0.93316667,1.04,0.9856,3072,4/20/2021 14:51,female,1,2001,3 -0.72885714,0.70357143,0.79772727,0.84142857,3072,4/20/2021 14:52,female,1,2001,3 -0.90175,0.63169231,0.84411111,1.0066,3073,4/20/2021 14:50,male,1,1963,3 -0.90854545,0.70883333,0.803125,0.8875,3073,4/20/2021 14:51,male,1,1963,3 -2.97333333,5.176,3.786,2.8455,3074,4/20/2021 14:55,female,1,1948,1 -2.586,2.36,2.197,1.99266667,3074,4/20/2021 14:56,female,1,1948,1 -0.896625,0.78035714,0.9348,0.897125,3075,4/20/2021 14:54,male,1,1970,2 -0.58709091,0.67609091,0.59606667,0.60090909,3075,4/20/2021 15:06,male,1,1970,2 -3.949,3.49866667,3.1575,2.10575,3076,4/20/2021 14:59,male,1,1943,2 -2.8535,1.749,1.463,2.07975,3076,4/20/2021 14:59,male,1,1943,2 -0.96483333,1.48833333,1.0626,0.9901,3077,4/20/2021 15:00,female,0,1971,2 -0.86828571,0.80673333,1.085,0.9435,3077,4/20/2021 15:01,female,0,1971,2 -2.416,2.4452,1.4565,1.5975,3078,4/20/2021 15:09,female,1,1959,2 -1.2235,1.57025,2.61,2.92075,3078,4/20/2021 15:18,female,1,1959,2 -1.394,1.585,1.45525,1.055,3079,4/20/2021 15:13,male,1,1971,2 -0.7184,0.753,0.859,0.96225,3079,4/20/2021 15:14,male,1,1971,2 -0.57709091,0.6915,0.60775,0.66391667,3080,4/20/2021 15:12,female,1,1971,2 -0.64427273,0.721,0.60558333,0.57321429,3080,4/20/2021 15:18,female,1,1971,2 -1.768,1.8476,1.8735,2.136,3081,4/20/2021 15:16,female,1,1955,2 -1.685,1.5085,1.36257143,2.147,3081,4/20/2021 15:16,female,1,1955,2 -0.80922222,1.01457143,0.9,0.791,3083,4/20/2021 15:37,male,1,2001,3 -8.43,7.015,1.6695,9.743,3084,4/20/2021 15:28,male,1,1942,1 -3.23,4.864,2.275,2.3054,3084,4/20/2021 15:29,male,1,1942,1 -1.09555556,0.9769,1.1505,1.39325,3085,4/20/2021 15:26,male,1,1971,2 -1.23188889,1.1308,1.1628,1.61125,3085,4/20/2021 15:25,male,1,1971,2 -1.1355,1.165,1.00116667,0.86625,3086,4/20/2021 15:26,female,1,1967,3 -1.12066667,0.840625,0.83972727,0.71855556,3086,4/20/2021 15:27,female,1,1967,3 -0.54925,0.5045,0.76966667,0.60123077,3087,4/20/2021 15:35,male,1,1973,2 -0.47138462,0.563,0.69827273,0.5828,3087,4/20/2021 15:27,male,1,1973,2 -1.24683333,1.03325,1.54083333,1.7118,3088,4/20/2021 15:36,female,1,1998,3 -0.76963636,0.7635,1.23257143,0.84622222,3088,4/20/2021 15:37,female,1,1998,3 -0.84058333,0.82842857,0.95214286,0.8665,3089,4/20/2021 15:34,female,1,1978,2 -0.754,0.76922222,0.864,0.9323,3089,4/20/2021 15:33,female,1,1978,2 -1.6155,1.701,1.69875,1.808,3090,4/20/2021 15:35,male,1,1967,2 -1.69666667,2.342,1.5956,1.52025,3090,4/20/2021 15:36,male,1,1967,2 -7.777,2.967,1.397,15.564,3091,4/20/2021 15:40,male,1,1941,1 -0.788,0.8433,0.95925,0.80166667,3092,4/20/2021 15:46,female,1,1959,3 -1.156875,1.063,0.89866667,1.14133333,3093,4/20/2021 15:49,female,1,1972,3 -1.043,10.777,1.47733333,1.745,3093,4/20/2021 15:50,female,1,1972,3 -0.8785,0.762,0.60383333,0.8327,3094,4/20/2021 15:57,female,1,1999,4 -0.742125,0.91314286,0.8593,0.8936,3094,4/20/2021 15:56,female,1,1999,4 -0.734,0.7223,0.729,0.9956,3095,4/20/2021 16:10,female,1,1981,2 -0.64083333,1.2695,0.742375,0.60833333,3095,4/21/2021 1:06,female,1,1981,2 -1.05666667,0.71928571,1.34642857,0.98011111,3097,4/20/2021 15:59,female,1,1953,1 -1.308,1.24633333,1.2015,1.17075,3097,4/20/2021 15:58,female,1,1953,1 -1.902,1.3915,1.36925,1.5046,3098,4/20/2021 15:57,female,1,1945,1 -1.562,1.39633333,1.7134,1.23025,3098,4/20/2021 15:59,female,1,1945,1 -1.672,1.91,2.4406,2.96733333,3099,4/20/2021 16:04,male,1,1945,1 -3.851,5.41,2.76533333,4.06,3099,4/20/2021 16:03,male,1,1945,1 -0.99657143,0.8445,1.3252,1.0955,3100,4/20/2021 16:10,female,1,1969,4 -5.67525,2.174,1.077,0.904,3101,4/20/2021 16:14,female,1,1945,1 -2.13457143,1.32066667,0.9889,1.05,3101,4/20/2021 16:16,female,1,1945,1 -1.08075,0.9745,1.31683333,1.0212,3102,4/20/2021 16:25,female,1,1946,1 -0.80685714,0.75171429,1.09075,0.99366667,3102,4/27/2021 14:18,female,1,1946,1 -1.16933333,0.92591667,1.3376,0.955375,3103,4/20/2021 16:29,female,1,1973,2 -1.201,1.477,1.162375,1.0992,3103,4/20/2021 16:29,female,1,1973,2 -2.78666667,1.6988,1.19666667,1.062125,3104,4/20/2021 16:34,male,1,1956,2 -1.33283333,1.7555,1.77716667,2.40633333,3104,4/20/2021 16:35,male,1,1956,2 -1.13516667,1.23,1.11733333,1.10355556,3105,4/20/2021 16:43,female,1,1979,3 -0.88222222,1.10355556,0.8514,1.07733333,3105,4/20/2021 16:44,female,1,1979,3 -1.42866667,1.267375,0.9485,0.859,3106,4/20/2021 16:59,female,1,2001,2 -2.02625,1.7515,1.877,1.875,3107,4/20/2021 17:15,male,1,1941,1 -2.85566667,2.699,2.3562,2.0875,3107,4/20/2021 17:16,male,1,1941,1 -1.05144444,1.337,1.62116667,0.996,3108,4/20/2021 16:58,male,1,1957,3 -1.14385714,1.14566667,0.96209091,1.07714286,3108,4/20/2021 16:57,male,1,1957,3 -3.9085,2.14966667,3.992,4.0285,3109,4/20/2021 17:05,male,1,1955,1 -2.55266667,2.73766667,2.34025,2.577,3109,4/20/2021 17:06,male,1,1955,1 -2.23066667,3.116,2.43,2.6105,3111,4/20/2021 23:30,female,1,1975,3 -2.175,4.05333333,2.5,2.574,3111,4/20/2021 23:29,female,1,1975,3 -1.23075,1.31033333,1.56366667,1.007,3112,4/20/2021 17:24,female,1,1975,2 -1.9985,1.51166667,2.2795,1.517875,3112,4/20/2021 17:32,female,1,1975,2 -3.77333333,2.41,6.505,3.16533333,3113,4/20/2021 17:33,female,1,1965,1 -1.89075,2.456,2.651,1.779,3113,4/20/2021 17:34,female,1,1965,1 -2.118,4.0675,1.43433333,1.924,3114,4/21/2021 21:48,female,1,1940,1 -1.8776,1.13625,1.912,1.51433333,3115,4/20/2021 17:37,female,1,1961,2 -1.63314286,2.17333333,1.6296,1.7585,3115,4/20/2021 17:38,female,1,1961,2 -2.7545,1.46433333,1.72133333,2.26633333,3116,4/20/2021 17:43,female,1,1956,1 -1.4616,1.44466667,2.19,2.0842,3116,4/20/2021 17:44,female,1,1956,1 -0.7795,0.99266667,0.86042857,0.99977778,3117,4/20/2021 18:07,female,1,1946,1 -0.786,0.95375,0.93625,0.96628571,3117,4/20/2021 18:07,female,1,1946,1 -0.63488889,0.66483333,0.57578571,0.65375,3118,4/20/2021 18:04,male,0,1953,1 -0.61833333,0.70211111,0.7985,0.62871429,3118,4/20/2021 18:05,male,0,1953,1 -1.04842857,1.244,1.212,0.96271429,3120,4/20/2021 18:12,male,1,1976,3 -1.09042857,1.09471429,1.136,1.20683333,3123,4/20/2021 18:10,male,1,1956,2 -0.84090909,0.89816667,1.16066667,1.0905,3123,4/20/2021 18:11,male,1,1956,2 -1.01771429,1.17033333,1.13775,1.22822222,3124,4/20/2021 18:32,male,1,1951,2 -1.31816667,1.4296,1.77025,1.2858,3124,4/20/2021 18:31,male,1,1951,2 -0.74588889,0.99314286,0.939375,1.063125,3125,4/20/2021 18:26,female,1,1980,3 -0.813,0.905,0.791,1.567,3125,4/20/2021 18:27,female,1,1980,3 -0.763,0.57463636,0.66772727,0.87333333,3126,4/20/2021 18:38,female,1,2001,4 -0.7049,0.6627,0.6988,0.74725,3126,4/20/2021 18:37,female,1,2001,4 -1.0105,1.4088,1.31966667,1.312,3127,4/20/2021 18:40,male,1,1976,2 -1.06371429,1.20185714,1.0384,1.30433333,3127,4/20/2021 18:41,male,1,1976,2 -0.62636364,0.63411111,0.5685,0.6460625,3128,4/20/2021 18:50,male,1,1950,2 -0.74009091,0.751,0.53569231,0.52527273,3128,4/20/2021 18:49,male,1,1950,2 -0.6745,1.72522222,0.61485714,0.7715,3129,4/20/2021 18:57,male,1,2000,4 -0.6365,0.538,0.64742857,0.62477778,3129,4/20/2021 18:58,male,1,2000,4 -1.2335,2.88033333,1.44166667,2.057,3130,4/20/2021 19:07,male,1,1941,1 -2.06733333,1.63175,1.69942857,2.3325,3130,4/20/2021 19:06,male,1,1941,1 -0.96471429,1.34675,1.473,1.598,3131,4/20/2021 19:03,female,1,1967,2 -0.92,1.0694,1.65,1.756,3131,4/20/2021 19:04,female,1,1967,2 -4.009,3.8175,1.649,1.5122,3132,4/20/2021 19:21,male,1,1959,2 -2.342,2.16666667,2.32266667,1.758,3132,4/20/2021 19:20,male,1,1959,2 -1.172,1.32628571,1.13414286,1.814,3133,4/20/2021 19:26,male,1,1963,2 -1.07728571,1.11871429,1.15583333,1.501,3133,4/20/2021 19:27,male,1,1963,2 -1.73928571,1.671,1.464,1.467,3134,4/20/2021 19:26,male,1,1960,2 -1.673,1.46683333,1.6235,1.61057143,3134,4/20/2021 19:26,male,1,1960,2 -0.9576,1.1712,1.233,1.04,3135,4/20/2021 19:41,male,1,1975,1 -1.17585714,1.21842857,1.466,1.846,3136,4/20/2021 19:55,female,1,1955,2 -1.0046,1.035,1.844,2.29966667,3136,4/20/2021 19:55,female,1,1955,2 -2.05933333,1.41071429,1.10016667,2.18266667,3137,4/20/2021 19:45,female,1,1960,1 -1.22585714,1.23516667,1.1114,1.39033333,3137,4/20/2021 19:45,female,1,1960,1 -2.181,2.4005,2.146,2.694,3138,4/20/2021 19:50,female,1,1958,1 -2.031,1.73728571,1.7318,1.7055,3138,4/20/2021 19:51,female,1,1958,1 -1.44525,1.86825,1.617,1.4916,3140,4/20/2021 19:55,male,1,1957,2 -1.19175,1.404625,1.3676,1.4094,3140,4/20/2021 19:55,male,1,1957,2 -0.8345,0.57308333,0.66,0.55652941,3141,4/21/2021 20:28,male,1,1978,4 -0.53784615,0.4838,0.84727273,0.46630769,3141,4/21/2021 20:29,male,1,1978,4 -0.91857143,1.10333333,0.97025,1.01955556,3142,4/20/2021 19:58,male,1,1977,3 -0.77036364,0.99283333,0.944,1.26757143,3142,4/20/2021 19:59,male,1,1977,3 -0.95628571,1.01575,0.87225,0.96625,3143,4/20/2021 20:04,male,1,1966,5 -0.86633333,0.9315,0.8822,0.9837,3143,4/20/2021 20:19,male,1,1966,5 -0.82616667,0.9134,0.60392857,0.7221,3144,4/20/2021 20:08,male,1,1972,2 -0.7645,0.60644444,0.60171429,0.6005,3144,4/20/2021 20:09,male,1,1972,2 -1.5004,2.436,2.411,2.423,3145,4/20/2021 20:08,male,1,1955,1 -1.36183333,2.12425,1.3985,1.57766667,3145,4/20/2021 20:09,male,1,1955,1 -4.26,2.859,2.1992,2.2175,3148,4/20/2021 20:09,male,1,1944,1 -1.737,3.39,1.795,3.054,3148,4/20/2021 20:10,male,1,1944,1 -0.888,0.82045455,0.838875,1.426,3149,4/21/2021 20:36,female,1,1974,3 -0.8182,0.755375,0.8946,1.0807,3149,4/21/2021 20:36,female,1,1974,3 -0.8348,0.71133333,0.64016667,0.7042,3150,4/20/2021 20:15,male,1,1971,4 -0.7921,0.66942857,0.87855556,0.63642857,3150,4/20/2021 20:16,male,1,1971,4 -1.3905,1.45066667,1.74533333,10.69,3151,4/20/2021 20:36,female,1,1953,1 -1.3905,1.45066667,1.74533333,10.69,3151,4/20/2021 20:36,female,1,1953,1 -0.98333333,1.41388889,0.8912,1.36714286,3152,4/21/2021 20:40,female,1,1955,2 -0.852,0.87716667,0.81266667,3.3814,3152,4/21/2021 20:40,female,1,1955,2 -3.6755,2.3835,2.282,2.452,3153,4/20/2021 20:30,female,1,1942,1 -6.102,4.004,2.185,4.083,3153,4/20/2021 20:31,female,1,1942,1 -1.43575,2.306,1.8095,1.40742857,3155,4/20/2021 20:32,female,1,1959,2 -1.947,1.84416667,1.296,1.7105,3155,4/20/2021 20:33,female,1,1959,2 -0.893375,0.97371429,0.78318182,0.7269,3156,4/20/2021 21:47,female,1,2001,2 -1.00633333,1.128625,0.97925,0.9425,3156,4/20/2021 21:07,female,1,2001,2 -0.85344444,1.02975,0.83688889,1.04,3156,4/20/2021 21:46,female,1,2001,2 -1.35542857,1.4212,1.17233333,1.40971429,3157,4/20/2021 20:51,male,1,1961,2 -0.99514286,1.0894,1.5844,1.06033333,3157,4/20/2021 20:52,male,1,1961,2 -1.7835,0.948,1.247,1.4635,3158,4/20/2021 20:57,male,1,1953,1 -0.93371429,0.88154545,0.891,0.9535,3159,4/20/2021 21:18,female,1,1967,4 -0.84683333,0.9012,0.8115,0.99722222,3159,4/20/2021 21:19,female,1,1967,4 -1.599,1.282,1.03228571,2.515,3160,4/20/2021 21:39,female,1,1959,1 -1.03883333,1.027,0.98166667,1.185,3160,4/20/2021 21:40,female,1,1959,1 -1.77233333,2.389,2.25066667,2.565,3162,4/20/2021 21:21,female,1,1948,1 -2.052,1.90466667,1.9146,2.2675,3162,4/20/2021 21:22,female,1,1948,1 -0.941625,0.897375,1.151,0.86509091,3163,4/20/2021 21:22,male,1,1956,2 -0.72155556,0.7275,0.78311111,0.622875,3163,4/20/2021 21:23,male,1,1956,2 -0.6775,1.277,0.806,0.901,3164,4/20/2021 21:37,female,1,1955,1 -0.79666667,4.5115,1.215,1.062,3164,4/20/2021 21:40,female,1,1955,1 -2.2055,1.581,2.05866667,2.15,3165,4/20/2021 21:28,female,1,1942,2 -2.0788,1.8426,1.96366667,2.2115,3165,4/20/2021 21:29,female,1,1942,2 -0.91575,0.92214286,1.0166,0.85114286,3166,4/20/2021 21:30,male,1,1976,5 -0.96,0.90963636,0.8638,0.8494,3166,4/20/2021 21:31,male,1,1976,5 -1.37,1.7974,1.4425,1.4226,3167,4/20/2021 21:33,female,1,1973,3 -1.476,1.132625,1.292,1.10575,3167,4/20/2021 21:34,female,1,1973,3 -1.218,1.18225,0.88225,0.9135,3169,4/20/2021 21:44,male,1,1968,3 -0.8433,1.0405,0.85033333,1.06757143,3170,4/20/2021 21:51,male,1,1979,4 -0.70536364,1.05633333,0.85628571,0.9294,3170,4/20/2021 21:52,male,1,1979,4 -2.31966667,2.06566667,2.58666667,2.28266667,3171,4/20/2021 21:56,male,1,1953,2 -1.91575,1.92625,2.1495,1.667,3171,4/20/2021 21:56,male,1,1953,2 -0.86627273,0.90675,0.75557143,1.869,3173,4/20/2021 22:02,female,1,2001,2 -0.791,0.91325,0.637,0.7924,3173,4/20/2021 22:03,female,1,2001,2 -1.2703,1.07766667,1.256,1.0236,3174,4/20/2021 22:05,male,0,1972,3 -1.2703,1.07766667,1.256,1.0236,3174,4/20/2021 22:05,male,0,1972,3 -1.44571429,1.2245,1.01242857,1.1875,3174,4/20/2021 21:58,male,0,1972,3 -0.99866667,1.7506,1.22733333,1.1058,3174,4/20/2021 21:59,male,0,1972,3 -1.407,1.1155,1.420625,0.91866667,3176,4/20/2021 22:13,male,1,1980,3 -1.2615,0.99083333,1.316,1.40075,3176,4/20/2021 22:14,male,1,1980,3 -0.81046154,1.048625,0.99357143,0.66866667,3177,4/20/2021 22:05,female,1,1980,4 -0.96,1.28725,1.46966667,1.016,3177,4/20/2021 22:06,female,1,1980,4 -4.26233333,3.313,1.831,1.649,3178,4/20/2021 22:07,male,1,1941,2 -2.542,1.323,2.1265,2.727,3178,4/20/2021 22:08,male,1,1941,2 -2.36766667,2.27633333,1.70666667,2.1726,3179,4/20/2021 22:09,male,1,1960,2 -2.4775,2.124,3.073,2.05725,3179,4/20/2021 22:10,male,1,1960,2 -3.3748,1.50766667,1.882,2.2035,3180,4/20/2021 22:28,male,1,1965,2 -1.9105,1.24966667,3.0495,2.27275,3180,4/20/2021 22:29,male,1,1965,2 -1.6044,1.582,1.4025,1.382375,3181,4/20/2021 22:16,female,1,1978,1 -1.6498,1.829,1.10542857,1.4416,3181,4/20/2021 22:16,female,1,1978,1 -0.79563636,0.7069,0.76644444,0.6755,3182,4/20/2021 22:17,male,1,2000,4 -0.68669231,0.5183125,0.82583333,0.64881818,3182,4/20/2021 22:18,male,1,2000,4 -2.258,1.4278,1.3475,2.20085714,3183,4/20/2021 22:24,male,1,1967,3 -1.431,1.00975,1.7275,1.01366667,3183,4/20/2021 22:24,male,1,1967,3 -0.99371429,1.1896,0.703625,0.75018182,3184,4/20/2021 22:24,male,1,1971,2 -0.6541,0.81983333,0.835375,0.868,3184,4/20/2021 22:25,male,1,1971,2 -1.959,1.68225,1.7078,1.5866,3186,4/20/2021 22:33,female,1,1959,1 -1.264,1.304,2.92,2.7786,3186,4/22/2021 21:04,female,1,1959,1 -2.044,2.3035,2.15225,2.02883333,3187,4/20/2021 22:31,female,1,1957,1 -1.05266667,1.60366667,1.7465,1.4064,3187,4/20/2021 22:32,female,1,1957,1 -0.499,0.61681818,0.61658333,0.55369231,3189,4/20/2021 22:59,male,1,2001,4 -0.732,0.56066667,0.45675,0.483,3189,4/20/2021 23:02,male,1,2001,4 -1.11933333,0.91925,1.12842857,0.963375,3190,4/20/2021 22:59,female,1,2001,3 -0.876125,0.75881818,0.92528571,0.72763636,3190,4/20/2021 23:01,female,1,2001,3 -1.91328571,1.56333333,1.1215,2.26033333,3192,4/20/2021 22:39,female,1,1940,1 -0.91933333,1.66575,2.30725,1.41928571,3192,4/20/2021 22:39,female,1,1940,1 -1.3214,1.10542857,1.25783333,1.11571429,3193,4/20/2021 22:46,male,0,1956,1 -5.153,1.69,1.7515,2.784,3193,4/22/2021 21:16,male,0,1956,1 -1.597,1.764,1.93033333,1.4965,3194,4/20/2021 22:57,female,1,1969,3 -1.00777778,1.6285,1.2415,0.72875,3194,4/20/2021 22:57,female,1,1969,3 -0.794,0.85666667,0.645,1.1395,3195,4/20/2021 23:01,male,1,1969,4 -1.47375,1.24283333,1.443,1.375,3196,4/20/2021 23:12,male,1,1957,1 -0.55953846,0.71246154,0.43869231,0.69357143,3198,4/20/2021 23:12,male,1,1976,3 -1.4344,0.793125,0.99028571,1.00677778,3199,4/20/2021 23:26,female,1,2001,3 -0.66111111,0.5276,0.863875,0.65375,3199,4/20/2021 23:27,female,1,2001,3 -0.93658333,0.97985714,0.93542857,0.85416667,3200,4/20/2021 23:23,male,1,1960,3 -0.69433333,0.95427273,0.79185714,0.7118,3200,4/20/2021 23:22,male,1,1960,3 -1.40366667,1.262875,1.1135,1.58785714,3201,4/20/2021 23:25,male,1,1961,2 -1.40366667,1.262875,1.1135,1.58785714,3201,4/20/2021 23:25,male,1,1961,2 -1.3921,1.793,1.2964,1.54566667,3201,4/20/2021 23:25,male,1,1961,2 -0.78541667,1.4336,1.102,0.8794,3202,4/20/2021 23:28,female,1,1971,3 -1.37266667,0.88618182,0.91083333,0.831,3202,4/20/2021 23:29,female,1,1971,3 -0.59390909,0.61706667,0.61377778,0.59385714,3203,4/20/2021 23:41,male,1,1978,3 -0.58894118,0.51027273,0.61522222,0.6167,3203,4/20/2021 23:42,male,1,1978,3 -0.81555556,0.915125,0.96066667,0.86963636,3204,4/20/2021 23:46,female,1,1971,1 -1.04933333,1.15633333,1.0005,0.99833333,3204,4/20/2021 23:47,female,1,1971,1 -0.70933333,0.717,0.81390909,0.92614286,3206,4/20/2021 23:46,female,1,1979,3 -0.723,0.61227273,0.85415385,0.7718,3206,4/20/2021 23:46,female,1,1979,3 -2.843,3.852,4.4605,4.307,3207,4/20/2021 23:45,male,1,1977,2 -3.963,3.0265,4.126,2.77466667,3207,4/20/2021 23:46,male,1,1977,2 -1.2256,1.09133333,1.305,1.71,3209,4/20/2021 23:51,female,1,1974,4 -1.017375,1.0166,1.3004,1.42742857,3209,4/20/2021 23:52,female,1,1974,4 -1.2358,0.673,1.33925,1.3034,3211,4/20/2021 23:58,male,1,1960,2 -1.2825,1.5684,1.37925,24.7718,3211,4/20/2021 23:59,male,1,1960,2 -0.75772727,0.632,0.83611111,0.671,3212,4/21/2021 0:06,female,1,1976,3 -0.84275,0.58827273,0.8277,0.8376,3212,4/21/2021 0:08,female,1,1976,3 -0.71242857,0.684,0.88990909,0.6825,3213,4/21/2021 0:08,female,0,1965,4 -0.944,0.799,0.8641,0.88163636,3213,4/21/2021 0:09,female,0,1965,4 -0.77585714,0.71871429,0.68423077,0.86458333,3214,4/21/2021 0:09,male,1,1967,3 -0.68413333,0.61946154,0.61281818,0.8288,3214,4/21/2021 0:10,male,1,1967,3 -3.99966667,7.373,3.506,5.359,3215,4/21/2021 0:09,male,1,1954,1 -5.541,6.544,5.669,7.652,3215,4/21/2021 0:10,male,1,1954,1 -2.647,2.6895,3.578,3.01666667,3216,4/21/2021 0:17,male,1,1952,1 -3.247,2.496,3.42966667,4.399,3216,4/21/2021 0:18,male,1,1952,1 -0.98857143,1.46716667,1.0431,1.12566667,3217,4/21/2021 0:17,male,1,1964,3 -1.43633333,0.88233333,1.051875,0.8578,3217,4/21/2021 0:17,male,1,1964,3 -1.28783333,1.31725,1.28225,1.1998,3218,4/21/2021 0:23,male,1,1973,2 -1.01,1.15733333,1.203,1.21214286,3218,4/21/2021 0:24,male,1,1973,2 -4.826,2.473,3.784,3.71033333,3220,4/21/2021 9:39,male,1,1957,1 -3.19733333,3.94433333,4.485,3.576,3220,4/21/2021 9:40,male,1,1957,1 -0.556,0.59457143,0.61322222,0.629125,3221,4/21/2021 0:33,female,1,1979,3 -0.66227273,0.78309091,0.75711111,0.79711111,3222,4/21/2021 0:37,female,1,1977,3 -0.69757143,0.77475,0.727,0.81341667,3222,4/21/2021 0:36,female,1,1977,3 -1.10383333,1.26066667,1.14442857,0.98836364,3223,4/21/2021 0:40,male,1,1974,4 -0.89190909,1.04175,0.80314286,0.86928571,3223,4/21/2021 0:41,male,1,1974,4 -0.7664,0.7255,0.9153,0.792,3224,4/21/2021 0:40,male,1,1959,4 -0.954,1.077,0.90655556,0.9695,3224,4/21/2021 0:40,male,1,1959,4 -0.72585714,1.036,0.89657143,0.86666667,3225,4/21/2021 0:42,male,1,1967,3 -0.841625,1.05709091,0.8092,0.97385714,3225,4/21/2021 0:43,male,1,1967,3 -0.952,1.17,1.02142857,1.45033333,3226,4/21/2021 0:59,female,1,1952,3 -1.233,0.856,1.6145,0.93958333,3226,4/21/2021 0:58,female,1,1952,3 -1.5656,2.0234,1.623,1.41475,3227,4/21/2021 0:57,male,1,1959,1 -1.7334,1.73925,1.5785,1.3642,3227,4/21/2021 0:57,male,1,1959,1 -1.55,1.652,1.41283333,1.66816667,3228,4/21/2021 0:59,male,1,1954,2 -1.55,1.652,1.41283333,1.66816667,3228,4/21/2021 0:59,male,1,1954,2 -1.6675,2.28233333,1.685,1.606,3228,4/21/2021 0:58,male,1,1954,2 -1.2868,1.421,1.4326,1.38733333,3229,4/21/2021 0:58,male,1,1969,2 -1.42042857,1.62375,2.121,1.563,3229,4/21/2021 0:59,male,1,1969,2 -1.10128571,1.76283333,2.568,1.6194,3230,4/21/2021 1:20,male,1,1970,3 -0.545,1.381,0.778,0.8595,3230,4/21/2021 2:33,male,1,1970,3 -2.012,0.94583333,1.01975,2.01925,3231,4/21/2021 1:53,male,1,2002,4 -1.23416667,1.2,1.6876,1.4655,3231,4/21/2021 2:02,male,1,2002,4 -3.466,2.98975,2.93466667,2.392,3232,4/21/2021 2:22,female,1,1950,2 -1.41133333,1.85125,1.81171429,2.728,3232,4/21/2021 2:23,female,1,1950,2 -0.718,0.80371429,0.73566667,0.74784615,3234,4/21/2021 1:08,female,1,1978,4 -0.73872727,0.80325,0.57706667,0.797875,3234,4/21/2021 1:09,female,1,1978,4 -2.009,1.134,1.16385714,1.80475,3235,4/21/2021 1:17,male,1,1957,1 -1.59342857,1.429,1.6462,1.357,3235,4/21/2021 1:17,male,1,1957,1 -1.2595,1.113,1.116,1.21925,3236,4/21/2021 1:17,male,1,1966,5 -1.381,1.6124,1.10133333,1.54928571,3236,4/21/2021 1:18,male,1,1966,5 -0.9845,1.131125,1.3684,1.096125,3236,4/21/2021 1:19,male,1,1966,5 -0.76375,0.7586,0.71354545,0.74081818,3238,4/21/2021 1:25,male,1,1971,5 -0.927375,0.75266667,1.464,0.86633333,3238,4/21/2021 1:24,male,1,1971,5 -1.097375,0.91766667,1.021,1.131,3239,4/21/2021 1:31,male,1,1959,2 -0.94525,1.047,1.15816667,0.99457143,3239,4/21/2021 1:32,male,1,1959,2 -1.0014,0.80884615,2.131,1.088,3240,4/21/2021 2:06,female,1,1975,3 -1.221,1.15657143,1.43233333,1.16125,3240,4/21/2021 1:53,female,1,1975,3 -0.915,0.89,0.871,0.984,3241,4/21/2021 1:39,female,1,1980,3 -0.6882,1.0495,0.74042857,0.8068,3241,4/21/2021 1:40,female,1,1980,3 -1.4034,1.02216667,0.9055,1.2705,3242,4/21/2021 2:06,female,0,1986,4 -1.29233333,1.364,1.1674,1.61175,3242,4/21/2021 1:53,female,0,1986,4 -2.556,1.52442857,1.33775,1.33525,3244,4/21/2021 2:20,female,1,1958,3 -1.196,0.961375,1.30933333,1.15957143,3244,4/21/2021 2:21,female,1,1958,3 -1.62966667,1.71475,1.018125,4.4195,3245,4/21/2021 2:21,male,1,1960,2 -2.312,3.75,2.4305,2.26266667,3245,4/21/2021 2:20,male,1,1960,2 -0.8302,0.88357143,0.895,0.98490909,3246,4/21/2021 2:36,male,1,1971,4 -1.06244444,0.85827273,0.7915,1.1975,3246,4/21/2021 2:36,male,1,1971,4 -1.10771429,1.33733333,1.00857143,1.02071429,3247,4/21/2021 2:44,male,1,1972,2 -0.78163636,1.94,0.9415,0.7231,3247,4/21/2021 2:44,male,1,1972,2 -0.77864286,0.762625,0.7959,0.65471429,3248,4/21/2021 3:02,female,1,1999,4 -1.35525,1.38857143,1.46375,1.49183333,3249,4/21/2021 6:22,male,1,1960,2 -1.2722,1.6725,1.118,1.2775,3249,4/21/2021 6:23,male,1,1960,2 -1.19025,1.299,1.1764,1.03785714,3250,4/21/2021 6:43,female,1,1956,2 -1.171125,1.16622222,1.23975,1.444,3250,4/21/2021 6:43,female,1,1956,2 -1.21716667,1.33675,1.2128,1.1666,3251,4/21/2021 6:59,male,1,1958,2 -1.39,1.34542857,1.25916667,1.445,3251,4/21/2021 7:00,male,1,1958,2 -1.1,1.13683333,1.075,1.09066667,3252,4/21/2021 9:08,male,1,1976,5 -1.3486,1.13275,1.34128571,1.17066667,3253,4/21/2021 9:36,male,1,1956,2 -1.06157143,1.2215,1.23728571,0.94766667,3253,4/21/2021 9:37,male,1,1956,2 -0.72666667,0.8428,0.70955556,0.66053846,3254,4/22/2021 14:53,male,1,1997,4 -0.96111111,0.98475,1.0474,1.11971429,3254,4/21/2021 9:43,male,1,1997,4 -0.72969231,0.604,0.71277778,0.93866667,3255,4/21/2021 9:59,female,1,1999,4 -0.58652941,0.58575,0.62563636,0.46846154,3255,4/21/2021 10:00,female,1,1999,4 -1.65275,1.50066667,2.15025,1.881,3256,4/21/2021 10:31,female,1,1976,2 -1.156,1.87285714,2.02566667,1.638,3256,4/21/2021 10:30,female,1,1976,2 -2.7495,3.23425,2.555,2.294,3257,4/21/2021 10:38,male,1,1960,2 -2.86,2.91533333,3.381,2.5025,3257,4/21/2021 10:38,male,1,1960,2 -1.3454,1.399,1.32133333,1.27525,3258,4/21/2021 10:39,male,1,1959,4 -0.8268,0.9358,0.85266667,0.91266667,3258,4/21/2021 10:39,male,1,1959,4 -0.8046,1.00728571,0.9845,0.928,3259,4/21/2021 10:49,female,1,1975,3 -0.951,1.36571429,1.0825,0.9384,3259,4/21/2021 10:50,female,1,1975,3 -2.65933333,2.7605,2.7,2.2105,3260,4/21/2021 11:00,female,1,1959,2 -2.9885,1.9696,3.664,2.49125,3260,4/21/2021 10:59,female,1,1959,2 -0.6685,0.901,0.62815385,0.73022222,3261,4/21/2021 11:00,female,1,2002,3 -0.60863636,0.76933333,0.684,0.6755,3261,4/21/2021 11:01,female,1,2002,3 -1.02325,1.025,1.089875,1.09314286,3262,4/21/2021 11:10,male,1,1972,3 -0.955,1.32816667,1.03966667,1.23183333,3262,4/21/2021 11:09,male,1,1972,3 -0.9372,0.95283333,1.18071429,0.9425,3263,4/21/2021 11:10,male,0,1970,3 -0.825,0.792625,0.922,0.757625,3263,4/21/2021 11:25,male,0,1970,3 -1.16411111,1.1832,1.5222,1.033,3264,4/21/2021 12:45,female,1,1986,2 -1.26842857,1.09557143,1.58075,1.00357143,3264,4/21/2021 12:45,female,1,1986,2 -1.29725,1.2075,1.24675,1.27128571,3265,4/21/2021 11:42,male,1,1970,3 -1.19466667,1.23183333,1.0695,1.51933333,3265,4/21/2021 11:43,male,1,1970,3 -1.526875,2.057,1.4285,1.2405,3267,4/21/2021 11:52,female,1,1966,2 -1.724,1.98316667,1.64575,1.52675,3267,4/21/2021 11:51,female,1,1966,2 -1.08816667,1.80933333,2.63733333,1.32466667,3268,4/21/2021 11:52,male,1,1963,2 -1.5555,1.6172,1.4274,1.5768,3268,4/21/2021 11:52,male,1,1963,2 -1.446,1.8454,1.61228571,1.3945,3269,4/21/2021 12:12,male,1,1969,3 -1.151,1.57433333,0.9732,1.1115,3269,4/21/2021 12:10,male,1,1969,3 -0.9735,0.723375,0.996875,0.685125,3270,4/21/2021 12:10,female,1,1963,3 -0.95,0.71675,0.7874,0.93042857,3270,4/21/2021 12:10,female,1,1963,3 -4.046,3.8445,3.932,2.451,3271,4/21/2021 12:23,female,1,1948,1 -2.213,2.71666667,1.902,2.754,3271,4/21/2021 12:22,female,1,1948,1 -2.245,1.107,1.16828571,1.28025,3272,4/21/2021 12:36,female,1,1974,3 -1.0682,1.35633333,1.1246,1.3845,3273,4/21/2021 12:37,male,1,1981,3 -0.91344444,1.45733333,0.988,1.26025,3273,4/21/2021 12:37,male,1,1981,3 -1.225375,1.4412,1.161,0.95133333,3274,4/21/2021 12:48,female,1,1958,2 -1.10344444,1.0174,1.16466667,1.02671429,3274,4/21/2021 12:49,female,1,1958,2 -0.87963636,1.0785,1.1456,1.189625,3275,4/21/2021 12:57,female,1,1954,3 -1.79966667,1.5585,1.41942857,1.52571429,3275,4/21/2021 12:58,female,1,1954,3 -1.05733333,0.97671429,1.21457143,1.31925,3276,4/21/2021 13:02,male,1,1958,3 -0.6765,0.759,1.1341,0.78,3276,4/21/2021 13:03,male,1,1958,3 -1.31033333,0.71771429,0.83430769,0.86828571,3277,4/21/2021 13:11,female,1,1958,3 -1.17842857,0.9494,1.07983333,1.14055556,3277,4/21/2021 13:11,female,1,1958,3 -0.59028571,0.75654545,0.6705,0.64742857,3278,4/21/2021 13:26,male,1,1961,4 -0.86,0.65825,0.6552,0.67309091,3278,4/21/2021 13:26,male,1,1961,4 -2.9705,2.4875,3.796,2.533,3279,4/21/2021 13:45,female,1,1953,2 -1.80775,1.86033333,1.9104,2.459,3279,4/21/2021 13:45,female,1,1953,2 -1.9345,2.1,1.99083333,2.07375,3280,4/21/2021 13:49,male,1,1951,2 -1.763,1.93466667,2.1716,1.918,3280,4/21/2021 13:51,male,1,1951,2 -2.468,3.5665,3.008,3.928,3281,4/21/2021 13:52,female,1,1949,2 -3.44866667,2.6,2.24833333,3.404,3281,4/21/2021 13:52,female,1,1949,2 -1.0247,1.3338,0.97528571,1.0358,3282,4/21/2021 13:54,male,1,1969,3 -1.2215,1.346625,1.171125,1.09566667,3282,4/21/2021 13:53,male,1,1969,3 -1.003625,0.99375,0.9377,0.90088889,3284,4/21/2021 14:09,female,0,1976,3 -1.05875,1.05955556,1.0208,0.92257143,3284,4/21/2021 14:37,female,0,1976,3 -2.46466667,2.785,2.051,2.01933333,3285,4/21/2021 14:13,male,1,1938,1 -2.731,3.01425,2.12933333,3.607,3285,4/21/2021 14:12,male,1,1938,1 -1.47242857,1.86066667,1.52366667,1.7665,3286,4/21/2021 14:16,female,1,1958,2 -1.823,1.71666667,1.81633333,1.85528571,3286,4/21/2021 14:17,female,1,1958,2 -4.17666667,2.031,3.44133333,2.861,3287,4/21/2021 14:20,female,0,1960,3 -2.22033333,2.53633333,3.461,1.851,3287,4/21/2021 14:19,female,0,1960,3 -1.292,1.162,1.14,1.124,3288,4/21/2021 14:23,male,1,1949,2 -1.361,1.065,0.822,1.619,3288,4/21/2021 14:23,male,1,1949,2 -1.614,1.8325,1.6472,1.79675,3289,4/21/2021 14:44,male,1,1960,1 -1.186,1.121,0.994,0.911,3290,4/21/2021 14:42,female,0,1945,1 -1.6842,1.4502,1.931,2.1105,3291,4/21/2021 14:54,male,1,1960,2 -1.82666667,1.917,1.6995,1.99275,3291,4/21/2021 14:54,male,1,1960,2 -1.212,1.3105,1.162,2.77,3292,4/21/2021 17:47,female,1,1956,1 -1.4466,1.6752,1.253,1.2708,3293,4/21/2021 15:56,female,1,1958,3 -1.37775,1.6398,1.2496,1.856,3293,4/21/2021 15:57,female,1,1958,3 -1.56,2.504,2.0425,1.41533333,3294,4/21/2021 16:11,female,1,1969,3 -1.05188889,1.34442857,0.963875,1.4295,3294,4/21/2021 16:11,female,1,1969,3 -2.165,2.5785,2.24525,2.1065,3295,4/21/2021 16:14,male,1,1969,3 -2.347,1.99166667,1.5652,1.7858,3295,4/21/2021 16:15,male,1,1969,3 -1.854,2.17825,2.20975,2.2085,3296,4/21/2021 16:37,male,0,1954,2 -1.57825,1.47466667,1.945,1.62525,3296,4/21/2021 16:37,male,0,1954,2 -0.91477778,1.39642857,0.89325,1.115,3297,4/21/2021 17:50,male,1,1978,3 -0.77016667,0.764,0.80075,0.83783333,3297,4/21/2021 22:24,male,1,1978,3 -1.594,2.756,2.126,1.95933333,3298,4/21/2021 17:49,male,1,1961,2 -1.14211111,1.2698,0.93266667,0.922625,3298,4/21/2021 22:00,male,1,1961,2 -1.336,1.755,1.52925,1.3756,3299,4/21/2021 18:00,male,1,1947,2 -1.336,1.755,1.52925,1.3756,3299,4/21/2021 18:00,male,1,1947,2 -1.3068,0.94083333,2.5555,1.856,3299,4/21/2021 18:01,male,1,1947,2 -0.94933333,1.176,0.92357143,1.3068,3300,4/21/2021 18:20,male,1,1949,1 -1.03527273,1.126,2.1275,1.3186,3301,4/21/2021 20:25,female,1,1957,2 -1.05714286,0.97516667,1.1098,1.13975,3301,4/21/2021 20:26,female,1,1957,2 -0.9332,1.338,1.42177778,1.2512,3302,4/21/2021 20:38,male,1,1970,3 -1.03066667,1.072,2.68366667,0.95725,3302,4/21/2021 20:39,male,1,1970,3 -0.87369231,0.84316667,1.3795,1.22216667,3303,4/21/2021 20:59,female,1,1976,3 -1.271,0.76414286,0.99542857,0.97081818,3303,4/21/2021 21:00,female,1,1976,3 -0.7185,0.65507143,0.9784,0.96963636,3304,4/21/2021 21:11,female,1,1971,3 -1.31475,0.762,0.637,2.03866667,3304,4/21/2021 21:11,female,1,1971,3 -1.006,1.058,0.82133333,0.776,3305,4/21/2021 19:33,male,1,1960,1 -1.2735,1.036,1.07633333,1.4148,3305,4/21/2021 19:34,male,1,1960,1 -1.4455,1.2485,1.470375,1.49,3306,4/21/2021 18:05,male,1,1978,2 -2.299,2.531,2.11833333,2.719,3306,4/21/2021 21:50,male,1,1978,2 -3.31525,2.743,2.5195,2.75766667,3307,4/21/2021 18:33,female,1,1948,3 -3.2676,2.123,2.2885,2.275,3307,4/21/2021 18:34,female,1,1948,3 -1.16857143,1.16033333,0.96427273,1.3236,3308,4/21/2021 18:46,female,1,1974,4 -1.06475,0.9986,0.982,1.271875,3308,4/21/2021 18:47,female,1,1974,4 -1.3225,1.7155,0.935,1.85671429,3309,4/21/2021 20:38,female,1,1955,2 -0.779,1.0605,1.02175,0.753,3309,4/21/2021 20:39,female,1,1955,2 -1.21383333,1.2095,1.4025,1.53983333,3310,4/21/2021 19:01,male,1,1956,3 -1.05557143,1.04716667,1.06244444,1.46875,3310,4/21/2021 19:01,male,1,1956,3 -0.8115,0.545,1.002,1.308,3311,4/21/2021 19:03,male,1,1972,4 -1.2724,1.24225,1.05045455,1.415,3313,4/21/2021 19:15,male,1,1957,3 -0.801,1.02016667,1.2948,1.584,3313,4/21/2021 19:16,male,1,1957,3 -2.98,3.611,2.16,4.162,3314,4/21/2021 21:58,male,1,1972,2 -20.499,4.017,1.678,3.495,3314,4/21/2021 19:28,male,1,1972,2 -1.703,1.55,1.838,1.753,3315,4/21/2021 19:34,male,1,1959,2 -1.65966667,2.0085,1.7866,1.708,3315,4/21/2021 19:34,male,1,1959,2 -2.986,3.579,2.256,4.339,3316,4/21/2021 19:42,male,1,1961,2 -2.21633333,1.7935,2.031,2.365,3317,4/21/2021 19:47,male,1,1953,2 -1.789,1.7995,1.899,2.4535,3317,4/21/2021 19:47,male,1,1953,2 -0.74842857,0.9666,0.99811111,0.98145455,3318,4/21/2021 19:44,male,0,1978,4 -0.97,0.807875,1.179,0.82944444,3318,4/21/2021 21:52,male,0,1978,4 -1.29142857,1.50516667,1.198,1.7495,3319,4/21/2021 19:52,male,1,1960,3 -1.38,1.50983333,1.39825,1.5508,3319,4/21/2021 19:53,male,1,1960,3 -0.77733333,0.903625,0.87755556,0.75592308,3320,4/21/2021 19:55,female,1,1974,4 -0.76318182,0.98516667,0.97016667,1.04955556,3320,4/21/2021 21:43,female,1,1974,4 -1.33116667,1.3765,1.23133333,1.87933333,3321,4/21/2021 20:08,male,1,1960,3 -1.12385714,0.91175,1.3765,2.0328,3321,4/21/2021 20:08,male,1,1960,3 -0.75557143,0.746,0.71464286,0.7795,3322,4/21/2021 20:13,male,1,1968,2 -2.61225,2.9805,2.19266667,3.1635,3323,4/21/2021 22:08,female,1,1956,2 -3.00166667,3.5495,3.955,2.89033333,3323,4/21/2021 21:10,female,1,1956,2 -0.9118,0.862875,0.75545455,0.83391667,3325,4/21/2021 20:24,male,1,1964,2 -0.69072727,0.832,0.7295,0.72473333,3325,4/21/2021 20:25,male,1,1964,2 -0.90863636,0.76555556,0.81057143,1.21066667,3326,4/21/2021 20:30,male,1,2001,3 -1.55775,0.87928571,1.0622,1.67328571,3326,4/21/2021 20:30,male,1,2001,3 -0.6211,0.54123077,0.52929412,0.48753333,3327,4/21/2021 20:37,female,1,1982,5 -0.56257143,0.54733333,0.624,0.80654545,3327,4/21/2021 20:38,female,1,1982,5 -0.704,0.456,0.863,0.912,3328,4/21/2021 20:50,male,1,2002,4 -0.67133333,0.6915,0.75725,0.54085714,3328,4/21/2021 20:50,male,1,2002,4 -0.94928571,1.202,1.03990909,1.1974,3329,4/21/2021 20:52,female,1,1955,3 -2.1295,1.10433333,1.354,1.57857143,3329,4/21/2021 20:53,female,1,1955,3 -0.60771429,0.5136,0.47873333,0.54791667,3330,4/21/2021 20:51,male,1,1992,5 -0.50609091,0.54058333,0.5354,0.51210526,3330,4/21/2021 20:51,male,1,1992,5 -0.69675,0.7333,0.6324,0.61541667,3331,4/21/2021 21:14,female,1,1970,4 -0.632,0.86228571,0.7224,0.8124,3331,4/21/2021 21:15,female,1,1970,4 -1.1375,1.51175,0.965875,2.952,3332,4/21/2021 21:19,male,1,1952,2 -2.0386,1.998,1.96066667,1.5016,3332,4/21/2021 21:18,male,1,1952,2 -0.48135714,0.497,0.5879,0.52210526,3333,4/21/2021 21:29,male,1,1970,4 -0.5302,0.54281818,0.70033333,0.55388235,3333,4/21/2021 21:30,male,1,1970,4 -1.5095,1.23833333,1.38316667,1.201,3334,4/21/2021 21:38,male,1,1975,3 -1.235375,1.15375,1.28133333,1.1342,3334,4/21/2021 21:37,male,1,1975,3 -1.148,1.10266667,1.18414286,1.14616667,3335,4/21/2021 21:42,male,1,1958,1 -1.720125,1.2902,1.30533333,1.1044,3335,4/21/2021 21:42,male,1,1958,1 -0.63325,0.49772727,0.79663636,0.653,3336,4/21/2021 21:46,female,1,1992,3 -0.608,0.51055556,1.17616667,0.74509091,3336,4/21/2021 21:51,female,1,1992,3 -1.0975,1.14314286,0.89177778,0.9286,3337,4/21/2021 21:48,female,1,1974,4 -0.7714,0.91423077,0.80555556,0.88533333,3337,4/21/2021 21:48,female,1,1974,4 -1.5706,1.31775,1.18775,1.603,3338,4/21/2021 21:56,male,1,1957,2 -1.662,1.501,1.67383333,1.5826,3338,4/21/2021 21:56,male,1,1957,2 -1.28016667,1.22133333,1.22244444,1.23766667,3339,4/21/2021 22:01,female,1,1960,2 -1.28333333,1.20066667,1.46163636,1.2248,3339,4/21/2021 22:01,female,1,1960,2 -1.02771429,0.98744444,0.86144444,0.81957143,3340,4/21/2021 22:00,male,1,1973,3 -0.8795,0.7927,0.8975,0.79566667,3340,4/21/2021 22:00,male,1,1973,3 -1.157,1.38611111,1.23814286,1.3055,3341,4/21/2021 22:11,female,1,1941,1 -1.3102,1.24128571,1.24714286,1.102,3341,4/21/2021 22:12,female,1,1941,1 -1.25371429,1.58,1.14725,1.37814286,3342,4/21/2021 22:16,female,1,1959,2 -1.36375,1.37757143,1.27271429,1.41175,3342,4/21/2021 22:17,female,1,1959,2 -3.577,4.688,3.757,3.14533333,3343,4/21/2021 22:19,female,1,1934,1 -5.55,3.9485,5.124,3.9095,3343,4/21/2021 22:19,female,1,1934,1 -2.008,2.677,3.818,2.22366667,3344,4/21/2021 22:36,male,1,1938,1 -2.038,2.2975,2.39325,2.46333333,3344,4/21/2021 22:37,male,1,1938,1 -2.1315,1.9865,2.239,2.075,3345,4/21/2021 22:35,female,1,1960,2 -2.59866667,3.4915,2.579,2.2575,3345,4/21/2021 22:36,female,1,1960,2 -0.87966667,0.96488889,0.97711111,1.12983333,3346,4/21/2021 22:47,female,1,1997,5 -0.7596,1.0532,1.2176,1.18266667,3346,4/21/2021 22:48,female,1,1997,5 -1.6515,1.4888,1.1972,1.30257143,3347,4/21/2021 22:53,female,1,1975,2 -1.614,1.48483333,1.2578,2.01575,3347,4/21/2021 22:54,female,1,1975,2 -2.46033333,1.513,1.8514,1.33525,3348,4/21/2021 23:09,male,0,2000,3 -4.8855,3.871,3.0325,1.89,3350,4/21/2021 23:12,female,1,1970,2 -0.96022222,1.0474,1.00983333,1.07344444,3351,4/21/2021 23:25,male,1,1955,3 -0.82183333,1.0076,0.88828571,1.05916667,3351,4/21/2021 23:26,male,1,1955,3 -1.27616667,1.263,0.9345,1.52033333,3352,4/21/2021 23:27,male,1,1981,2 -1.4256,1.3458,1.072,1.5354,3352,4/21/2021 23:28,male,1,1981,2 -0.77657143,1.53983333,1.0458,1.20175,3354,4/21/2021 23:30,male,1,1953,2 -1.114,0.89154545,1.058,0.954125,3354,4/21/2021 23:31,male,1,1953,2 -1.209,1.1295,2.2145,1.7334,3355,4/21/2021 23:33,female,1,1977,2 -0.71685714,1.0596,1.367,1.24988889,3355,4/21/2021 23:33,female,1,1977,2 -1.3942,2.5725,2.0176,1.6285,3356,4/21/2021 23:42,male,1,1960,3 -1.81771429,1.1705,1.2005,1.399,3357,4/21/2021 23:49,male,1,1985,3 -2.4145,1.387,1.0365,1.4226,3357,4/21/2021 23:49,male,1,1985,3 -1.60625,1.3365,1.13375,1.4398,3359,4/22/2021 0:15,male,1,1976,2 -1.053,1.15714286,1.289,1.41428571,3359,4/22/2021 0:15,male,1,1976,2 -1.31566667,1.7252,2.2416,1.987,3362,4/22/2021 0:30,male,1,1971,2 -2.4435,2.0468,2.421,1.589,3362,4/22/2021 0:29,male,1,1971,2 -3.26,11.473,9.228,3.125,3364,4/22/2021 0:31,female,1,1955,1 -5.116,4.292,4.449,2.947,3364,4/22/2021 0:31,female,1,1955,1 -1.224375,1.11457143,1.2814,1.32875,3365,4/22/2021 0:36,male,1,1999,4 -1.4465,1.0604,1.032,1.0835,3365,4/22/2021 0:36,male,1,1999,4 -3.149,4.703,3.42,3.8375,3367,4/22/2021 0:49,female,1,1952,1 -3.464,3.33133333,6.379,4.635,3367,4/22/2021 0:49,female,1,1952,1 -1.31033333,1.0256,1.49233333,1.13583333,3368,4/22/2021 0:55,female,0,1975,3 -1.24683333,1.002375,1.4055,1.45183333,3368,4/22/2021 0:54,female,0,1975,3 -0.93825,0.71333333,1.258375,1.2044,3369,4/22/2021 0:58,male,0,1977,3 -0.688,0.96155556,1.433125,1.1114,3369,4/22/2021 0:59,male,0,1977,3 -1.0916,1.13571429,1.497,1.90357143,3370,4/22/2021 1:13,male,1,1951,3 -1.194875,1.293,1.2924,1.307,3370,4/22/2021 1:12,male,1,1951,3 -1.3795,1.794,1.5985,1.6425,3371,4/22/2021 1:17,male,1,1955,3 -0.74776923,0.6496,1.236,0.95733333,3371,4/22/2021 1:17,male,1,1955,3 -1.25557143,1.06071429,1.294,1.064125,3372,4/22/2021 1:33,male,1,1957,3 -1.12111111,1.07414286,1.78175,1.22,3372,4/22/2021 1:32,male,1,1957,3 -0.62516667,0.686,0.6875,5.051,3373,4/22/2021 1:45,female,1,1960,3 -1.492,3.71133333,2.6272,2.108,3375,4/22/2021 15:01,female,1,1948,1 -2.054,2.01916667,1.644,1.7165,3375,4/22/2021 15:02,female,1,1948,1 -0.9765,0.9525,0.71766667,1.052,3376,4/22/2021 15:17,male,1,1968,2 -0.6815,0.69063636,0.60542857,0.68841667,3376,4/22/2021 15:18,male,1,1968,2 -0.70983333,0.66266667,0.6238125,0.57633333,3377,4/22/2021 15:40,female,1,1975,3 -0.7233,0.72508333,0.7304,0.55175,3377,4/22/2021 15:40,female,1,1975,3 -1.05333333,1.115,1.142,1.02983333,3378,4/22/2021 16:26,male,1,1966,2 -1.057,1.02325,1.02088889,1.112,3378,4/22/2021 16:26,male,1,1966,2 -1.02988889,0.80775,0.86811111,0.9495,3379,4/22/2021 21:41,male,1,1955,1 -2.6455,1.3275,1.29166667,2.802,3379,4/22/2021 21:40,male,1,1955,1 -1.02988889,0.80775,0.86811111,0.9495,3379,4/22/2021 21:41,male,1,1955,1 -0.58592308,0.61036364,0.608375,0.76557143,3380,4/23/2021 14:08,female,1,1996,4 -0.68384615,0.59141667,0.7295,0.66833333,3380,4/23/2021 14:09,female,1,1996,4 -0.54618182,0.5883125,0.6212,0.69672727,3381,4/23/2021 14:11,male,1,1968,2 -0.686375,0.55854545,0.751,0.65322222,3381,4/23/2021 14:10,male,1,1968,2 -0.6318125,0.71914286,0.43285714,0.47970833,3382,4/23/2021 14:53,male,1,1958,3 -0.837,1.18,0.74,0.851,3382,4/23/2021 14:54,male,1,1958,3 -0.5977,1.0488,0.604,0.58161538,3383,4/23/2021 15:23,male,1,1961,4 -0.5805,0.657,0.5788,0.965,3383,4/23/2021 15:22,male,1,1961,4 -0.72242857,0.862,0.84909091,0.70575,3384,4/23/2021 18:07,female,1,2000,3 -0.8908125,0.659,0.68814286,0.87657143,3384,4/23/2021 18:08,female,1,2000,3 -0.8335,0.7334,0.82676923,0.68185714,3385,4/23/2021 18:22,male,1,2001,3 -0.668,0.8833,0.76553846,0.63944444,3385,4/23/2021 18:21,male,1,2001,3 -0.60514286,0.549125,0.75116667,0.675,3386,4/23/2021 18:26,female,1,2001,3 -0.53318182,0.7979,0.78118182,0.75588889,3386,4/23/2021 18:31,female,1,2001,3 -0.64383333,0.951375,0.71555556,0.89422222,3387,4/23/2021 18:53,male,1,1948,2 -0.64383333,0.951375,0.71555556,0.89422222,3387,4/23/2021 18:53,male,1,1948,2 -0.81025,0.86766667,0.72636364,0.76066667,3387,4/23/2021 18:52,male,1,1948,2 -1.46266667,0.966,1.0322,0.978,3388,4/23/2021 22:45,female,1,1966,3 -1.0068,0.79407692,1.1528,0.76127273,3388,4/23/2021 22:46,female,1,1966,3 -0.83628571,0.95133333,0.99383333,0.988,3389,4/24/2021 12:50,male,1,1971,2 -0.85233333,0.85757143,0.81891667,1.041875,3389,4/24/2021 12:50,male,1,1971,2 -0.66266667,0.73177778,0.79591667,0.7673,3390,4/24/2021 13:51,male,1,1971,3 -0.934,0.70971429,1.06842857,0.7182,3390,4/24/2021 13:52,male,1,1971,3 -1.448,1.76714286,1.38566667,1.67316667,3392,4/25/2021 15:22,female,1,1959,1 -2.1565,1.87766667,1.71025,1.528,3392,4/25/2021 15:22,female,1,1959,1 -2.0962,2.862,1.7818,1.791,3393,4/26/2021 20:03,male,1,1960,1 -1.908,2.0235,1.7796,1.7,3393,4/26/2021 20:04,male,1,1960,1 -1.831,1.76875,2.42025,1.8465,3394,4/26/2021 20:21,female,1,1961,1 -2.17,2.086,1.93533333,8.36,3394,4/26/2021 20:21,female,1,1961,1 -2.3965,3.377,1.636,2.456,3395,4/26/2021 20:49,female,1,1958,1 -1.5026,1.32875,1.711,1.6992,3395,4/26/2021 20:50,female,1,1958,1 -0.54157143,0.54681818,0.83088889,0.65730769,3409,5/7/2021 19:12,male,1,1995,4 -0.53890909,0.52686667,0.59688889,0.6948,3409,5/7/2021 19:16,male,1,1995,4 -0.5444,0.7144,0.6756,0.8158,3409,5/24/2021 10:19,male,1,1995,4 -0.5546,0.582,0.5576,0.5892,3409,6/2/2021 8:46,male,1,1995,4 -0.5286875,0.46216667,0.64957143,0.657,3409,5/7/2021 19:13,male,1,1995,4 -0.5604,0.5294,0.6098,0.6682,3409,5/21/2021 9:49,male,1,1995,4 -0.535,0.5532,0.6052,0.606,3409,5/27/2021 13:07,male,1,1995,4 -0.589,0.5098,0.5838,0.6448,3409,6/6/2021 15:28,male,1,1995,4 -0.55733333,0.515375,0.58425,0.58684211,3409,5/7/2021 19:14,male,1,1995,4 -0.578,0.5382,0.5942,0.708,3409,5/22/2021 10:44,male,1,1995,4 -0.6122,0.4686,0.577,0.5184,3409,5/31/2021 9:44,male,1,1995,4 -0.5664,0.487,0.6618,0.6904,3409,6/7/2021 10:55,male,1,1995,4 -0.56325,0.6175,0.59053846,0.59545455,3409,5/7/2021 19:15,male,1,1995,4 -0.5444,0.7144,0.6756,0.8158,3409,5/24/2021 10:19,male,1,1995,4 -0.5218,0.7054,0.6142,1.0196,3409,6/1/2021 9:15,male,1,1995,4 -0.848,1.492,0.694,1.59733333,3410,5/7/2021 19:30,male,1,1995,4 -1.135,1.452,0.728,2.27733333,3410,5/7/2021 19:31,male,1,1995,4 -0.95666667,2.0395,2.9205,0.92625,3410,5/7/2021 19:31,male,1,1995,4 -1.16533333,1.1805,0.681,0.89266667,3410,5/7/2021 19:29,male,1,1995,4 -0.76,1.904,1.019,1.176,3410,5/7/2021 19:32,male,1,1995,4 -1.1375,1.06542857,1.98025,1.492,3411,5/7/2021 19:27,male,1,1985,3 -0.81416667,0.92541667,1.1915,0.74322222,3411,5/7/2021 19:30,male,1,1985,3 -0.9332,0.95928571,1.71957143,0.789625,3411,5/7/2021 19:33,male,1,1985,3 -0.88611111,0.84442857,1.38375,0.99416667,3411,5/7/2021 19:28,male,1,1985,3 -0.7162,0.7564,1.036,0.90171429,3411,5/7/2021 19:31,male,1,1985,3 -0.85209091,0.897,1.13455556,0.898,3411,5/7/2021 19:29,male,1,1985,3 -0.799,1.10933333,1.1345,0.9,3411,5/7/2021 19:31,male,1,1985,3 -0.9278,0.87633333,1.35333333,0.79407692,3411,5/7/2021 19:29,male,1,1985,3 -0.64575,0.6688,0.88742857,1.101,3411,5/7/2021 19:32,male,1,1985,3 -0.661875,0.58445455,0.81853846,0.64554545,3412,5/7/2021 19:17,male,1,1994,3 -0.99257143,0.943,1.1558,1.25628571,3412,5/7/2021 19:12,male,1,1994,3 -0.81142857,0.71444444,0.75857143,0.899625,3412,5/7/2021 19:18,male,1,1994,3 -0.830875,0.726,1.08971429,0.723,3412,5/7/2021 19:15,male,1,1994,3 -0.71733333,0.742375,1.003375,0.75418182,3412,5/7/2021 19:17,male,1,1994,3 -0.86883333,0.7056,0.786125,0.6039,3413,5/7/2021 19:23,male,1,1981,3 -0.54822222,0.668,0.6833125,0.584,3413,5/7/2021 19:25,male,1,1981,3 -0.6968,0.8232,0.7674,0.6764,3413,5/26/2021 12:47,male,1,1981,3 -0.766,0.85576923,0.81644444,0.75522222,3413,5/7/2021 19:23,male,1,1981,3 -0.9782,0.932,0.8432,0.9306,3413,5/22/2021 11:33,male,1,1981,3 -0.6904,0.8282,0.69,0.7552,3413,5/27/2021 7:50,male,1,1981,3 -1.1035,0.89366667,1.187125,1.06114286,3413,5/7/2021 19:22,male,1,1981,3 -0.66125,0.90733333,0.78236364,0.66166667,3413,5/7/2021 19:24,male,1,1981,3 -0.7708,0.8118,0.9374,0.9598,3413,5/23/2021 10:18,male,1,1981,3 -0.6498,0.8848,0.6862,0.753,3413,5/28/2021 8:40,male,1,1981,3 -1.0286,0.7475,0.80646154,0.66858333,3413,5/7/2021 19:22,male,1,1981,3 -0.77992308,0.95688889,0.808,0.79642857,3413,5/7/2021 19:25,male,1,1981,3 -0.6674,0.8472,0.7964,0.7086,3413,5/25/2021 8:23,male,1,1981,3 -0.6272,0.5834,0.6668,0.8108,3413,6/3/2021 8:15,male,1,1981,3 -0.7901,0.66109091,0.81654545,0.75528571,3414,5/7/2021 19:11,female,1,1994,3 -0.60963636,0.55992308,0.79955556,0.8722,3414,5/7/2021 19:16,female,1,1994,3 -0.589,0.6836,0.72544444,0.62238462,3414,5/7/2021 19:12,female,1,1994,3 -0.7108,0.7368,0.6974,0.8064,3414,5/22/2021 23:53,female,1,1994,3 -0.65435714,0.628,0.7805,0.83055556,3414,5/7/2021 19:14,female,1,1994,3 -0.62078571,0.61190909,0.7642,0.66622222,3414,5/7/2021 19:15,female,1,1994,3 -0.7488,0.6628,0.6844,0.6404,3415,5/28/2021 6:15,female,1,1994,3 -0.81966667,0.841,0.96128571,0.8338,3415,5/7/2021 19:20,female,1,1994,3 -0.8982,0.4992,0.9364,0.587,3415,5/22/2021 8:34,female,1,1994,3 -0.6334,0.6854,0.6562,0.5914,3415,5/30/2021 15:03,female,1,1994,3 -0.7564,0.893875,0.72742857,0.9837,3415,5/7/2021 19:21,female,1,1994,3 -0.6136,0.6182,0.6918,0.5132,3415,5/23/2021 14:08,female,1,1994,3 -0.6692,0.55,0.6678,0.604,3415,5/31/2021 9:09,female,1,1994,3 -0.86428571,0.76557143,1.42642857,1.02125,3415,5/7/2021 19:15,female,1,1994,3 -0.8375,0.80957143,0.72228571,0.74355556,3415,5/7/2021 19:22,female,1,1994,3 -0.6806,0.563,0.716,0.6878,3415,5/26/2021 16:28,female,1,1994,3 -0.866,0.919,0.8962,0.856,3415,5/7/2021 19:18,female,1,1994,3 -0.6934,0.7424,0.7924,0.5934,3415,5/21/2021 10:16,female,1,1994,3 -0.7292,0.654,0.6684,0.6364,3415,5/27/2021 13:13,female,1,1994,3 -0.723,0.7857,0.714,0.8968,3416,5/7/2021 19:41,male,1,1986,4 -0.6925,0.67858333,0.6677,0.7614,3416,5/7/2021 19:42,male,1,1986,4 -0.714875,0.59711765,0.676,0.65841667,3416,5/7/2021 19:42,male,1,1986,4 -0.79925,0.8269,0.76446667,0.905,3416,5/7/2021 18:34,male,1,1986,4 -0.78536364,0.64783333,0.63963636,0.65166667,3416,5/7/2021 19:43,male,1,1986,4 -0.66676923,0.550625,0.591625,0.80266667,3417,5/7/2021 19:13,female,1,1997,3 -0.5392,0.64866667,0.65733333,0.59257143,3417,5/7/2021 19:16,female,1,1997,3 -0.66954545,0.5865,0.64372727,0.64377778,3417,5/7/2021 19:14,female,1,1997,3 -0.5678,0.653625,0.55594118,0.61966667,3417,5/7/2021 19:14,female,1,1997,3 -0.52388889,0.50417647,0.70636364,0.49322222,3417,5/7/2021 19:15,female,1,1997,3 -0.814,0.879,0.00E+00,0.815,3418,5/21/2021 12:18,male,1,1996,3 -0.00E+00,0.00E+00,0.953,0.00E+00,3418,6/3/2021 6:07,male,1,1996,3 -4.156,0.82,0.778,1.048,3418,5/7/2021 19:37,male,1,1996,3 -0.9085,0.967,0.6555,0.00E+00,3418,5/22/2021 13:22,male,1,1996,3 -0.8,0.00E+00,1.056,1.253,3418,6/5/2021 4:08,male,1,1996,3 -0.988,1.18933333,0.8864,0.8,3418,5/7/2021 19:39,male,1,1996,3 -1.6168,0.9912,1.943,1.1252,3418,5/23/2021 13:06,male,1,1996,3 -0.983,1.6675,1.044,1.096,3418,5/7/2021 19:41,male,1,1996,3 -0.6986,0.7692,0.766,0.9778,3418,6/2/2021 19:10,male,1,1996,3 -0.67723077,0.63883333,0.86357143,0.81544444,3421,5/7/2021 19:35,female,1,1970,2 -1.0828,0.928,0.937,0.8452,3421,6/3/2021 20:54,female,1,1970,2 -1.0762,0.877,0.848,0.7952,3421,6/8/2021 9:19,female,1,1970,2 -0.73744444,0.909,0.85683333,1.097,3421,5/7/2021 19:36,female,1,1970,2 -0.8276,0.6734,0.9844,1.0176,3421,6/5/2021 21:23,female,1,1970,2 -0.9766,1.1498,1.847,1.047,3421,5/22/2021 18:53,female,1,1970,2 -0.9436,0.7254,0.7486,0.797,3421,6/6/2021 21:21,female,1,1970,2 -1.4205,2.13383333,1.381,1.00966667,3421,5/7/2021 19:19,female,1,1970,2 -0.675875,0.80275,0.724,0.9448,3421,5/7/2021 19:35,female,1,1970,2 -0.9386,1.3,1.0908,1.1616,3421,6/2/2021 21:24,female,1,1970,2 -0.6834,0.8402,0.877,1.1844,3421,6/7/2021 21:34,female,1,1970,2 -0.85066667,0.84144444,0.99611111,0.80571429,3421,5/7/2021 19:34,female,1,1970,2 -0.75725,0.734,0.82983333,0.86983333,3423,5/7/2021 19:20,male,1,1994,4 -0.71316667,1.07890909,0.79585714,0.90825,3423,5/7/2021 19:17,male,1,1994,4 -0.62763636,0.65785714,0.80025,0.7328125,3423,5/7/2021 19:20,male,1,1994,4 -0.710375,0.57544444,0.72222222,0.76725,3423,5/7/2021 19:18,male,1,1994,4 -0.75125,0.89316667,0.74885714,0.68881818,3423,5/7/2021 19:19,male,1,1994,4 -0.65290909,0.56257143,0.60146154,0.62909091,3424,5/7/2021 19:28,male,0,1996,3 -0.62726667,0.6325,0.60378571,0.61177778,3424,5/7/2021 19:29,male,0,1996,3 -0.75425,0.812375,0.83433333,0.929,3424,5/7/2021 19:25,male,0,1996,3 -0.63033333,0.62928571,0.54388235,0.6847,3424,5/7/2021 19:31,male,0,1996,3 -0.792375,0.78575,0.70435714,1.2185,3424,5/7/2021 19:27,male,0,1996,3 -1.13357143,1.31,1.12333333,1.5375,3425,5/8/2021 14:56,female,1,1961,3 -1.11290909,1.20066667,1.53833333,1.0575,3425,5/8/2021 14:59,female,1,1961,3 -1.5105,1.615,1.6795,1.176,3425,5/8/2021 14:57,female,1,1961,3 -1.22583333,1.129,1.239875,0.90985714,3425,5/8/2021 15:00,female,1,1961,3 -1.73525,1.42066667,1.2755,1.10966667,3425,5/8/2021 14:58,female,1,1961,3 -1.07925,1.13233333,1.1318,1.14409091,3425,5/8/2021 14:55,female,1,1961,3 -1.011875,1.4556,1.263,0.92136364,3425,5/8/2021 14:58,female,1,1961,3 -1.34971429,1.56875,1.406,2.254,3427,5/8/2021 18:42,female,1,1956,3 -1.1222,1.35925,1.58916667,1.37083333,3427,5/8/2021 18:43,female,1,1956,3 -1.3162,1.41925,1.699,1.8915,3427,5/8/2021 18:40,female,1,1956,3 -1.41166667,1.91875,1.3506,1.6925,3427,5/8/2021 18:43,female,1,1956,3 -2.5385,1.9508,1.4455,1.3455,3427,5/8/2021 18:41,female,1,1956,3 -1.543,1.421,1.424,2.061,3430,5/13/2021 14:41,female,1,1961,2 -1.7685,2.663,1.56575,2.136,3430,5/13/2021 14:43,female,1,1961,2 -5.916,1.18133333,1.252,1.447,3430,5/13/2021 14:44,female,1,1961,2 -1.205,1.314,1.2435,1.472,3430,5/13/2021 14:45,female,1,1961,2 -3.648,1.4035,1.47,1.31775,3430,5/13/2021 14:40,female,1,1961,2 -3.891,0.755,1.6275,2.04533333,3432,5/17/2021 10:50,male,1,1963,5 -1.1336,0.986,2.5702,1.603,3432,5/25/2021 7:50,male,1,1963,5 -0.647,0.724,0.6206,0.667,3432,6/4/2021 8:08,male,1,1963,5 -14.865,1.179,1.9935,0.8475,3432,5/20/2021 10:09,male,1,1963,5 -0.982,1.0694,0.8354,1.0042,3432,5/26/2021 9:25,male,1,1963,5 -0.7074,0.7916,0.7204,0.6868,3432,6/5/2021 22:47,male,1,1963,5 -0.928,0.895,0.95966667,1.183,3432,5/24/2021 9:34,male,1,1963,5 -0.808,0.7542,0.7288,0.8232,3432,5/27/2021 7:46,male,1,1963,5 -0.7078,0.84,0.59333333,0.6854,3432,6/6/2021 11:17,male,1,1963,5 -1.1336,0.986,2.5702,1.603,3432,5/25/2021 7:50,male,1,1963,5 -0.7114,0.6754,0.7606,0.8602,3432,6/3/2021 9:14,male,1,1963,5 -0.709125,0.71366667,0.65575,0.66058333,3433,5/14/2021 20:47,male,1,1998,4 -0.8036,0.595,0.8186,0.6288,3434,5/21/2021 7:57,male,1,1994,3 -0.581,0.6032,0.6642,0.6072,3434,6/8/2021 7:56,male,1,1994,3 -0.6232,0.6474,0.7688,0.7044,3434,5/22/2021 7:24,male,1,1994,3 -0.722,0.546,0.6,0.665,3434,6/9/2021 7:30,male,1,1994,3 -0.5538,0.6646,0.6092,0.6144,3434,5/23/2021 10:41,male,1,1994,3 -0.7328,0.6454,0.677,0.6676,3434,6/10/2021 7:27,male,1,1994,3 -1.0146,0.6026,0.6274,0.6656,3434,6/7/2021 7:27,male,1,1994,3 -0.7696,0.722,0.9338,0.8274,3436,5/23/2021 11:09,female,1,1996,3 -0.7834,0.825,0.6854,0.755,3436,6/12/2021 16:40,female,1,1996,3 -0.9272,0.6134,1.0006,0.887,3436,6/8/2021 12:34,female,1,1996,3 -0.7296,0.682,0.7002,0.8692,3436,6/10/2021 15:00,female,1,1996,3 -0.7558,0.7398,1.142,0.8756,3436,5/22/2021 10:56,female,1,1996,3 -0.637,0.6392,0.8296,0.6748,3436,6/11/2021 16:59,female,1,1996,3 -0.9322,1.028,0.9634,1.0462,3438,5/26/2021 11:28,female,1,1960,3 -0.8382,1.0526,1.0344,0.9728,3438,5/26/2021 10:59,female,1,1960,3 -0.9766,1.0038,1.0116,1.1188,3438,5/26/2021 13:48,female,1,1960,3 -1.048,1.1256,1.0402,0.928,3438,5/26/2021 11:06,female,1,1960,3 -0.9952,1.061,0.9022,1.0962,3438,5/26/2021 11:15,female,1,1960,3 -1.3054,1.5776,1.4596,1.5104,3439,5/31/2021 12:57,female,1,1958,3 -1.8622,1.4938,1.2122,1.4592,3439,5/31/2021 13:00,female,1,1958,3 -1.7296,1.6836,1.3422,1.7904,3439,5/31/2021 12:46,female,1,1958,3 -1.2986,0.9482,1.1842,1.4522,3439,5/31/2021 13:02,female,1,1958,3 -1.3054,1.5776,1.4596,1.5104,3439,5/31/2021 12:57,female,1,1958,3 -1.2042,1.2842,1.5832,1.3438,3440,6/3/2021 11:14,male,1,1955,2 -1.1534,1.1816,1.2214,1.4284,3440,6/3/2021 11:29,male,1,1955,2 -1.1694,1.1986,1.2624,1.2174,3440,6/3/2021 13:40,male,1,1955,2 -1.1876,1.2404,1.0726,1.1168,3440,6/3/2021 9:33,male,1,1955,2 -1.228,1.3282,1.4682,1.337,3440,6/3/2021 13:49,male,1,1955,2 -1.7686,1.7162,1.556,1.6696,3441,6/6/2021 15:31,male,1,1959,1 -1.35,1.4212,1.428,1.5102,3441,6/6/2021 15:33,male,1,1959,1 -1.4488,1.5732,1.5886,1.3106,3441,6/6/2021 15:31,male,1,1959,1 -1.3528,1.3226,1.462,1.2804,3441,6/6/2021 15:34,male,1,1959,1 -1.5362,1.3658,1.5052,1.5484,3441,6/6/2021 15:32,male,1,1959,1 -1.323,1.2904,1.189,1.2956,3441,6/6/2021 15:33,male,1,1959,1 -5.3436,4.0946,3.2526,5.0188,3444,6/4/2021 21:24,male,1,1959,1 -2.5784,2.522,2.7282,2.7788,3445,6/4/2021 22:24,male,1,1958,1 -1.1572,1.775,1.9046,1.5914,3446,6/6/2021 13:45,male,1,1958,3 -1.1378,1.3772,1.9064,1.01,3446,6/6/2021 14:05,male,1,1958,3 -1.3084,1.076,1.2222,2.5686,3446,6/6/2021 14:02,male,1,1958,3 -1.1978,1.3692,1.3396,0.986,3446,6/6/2021 14:03,male,1,1958,3 -1.0454,2.2322,1.3892,0.8694,3446,6/6/2021 14:04,male,1,1958,3 -1.3034,1.3226,1.3532,1.1862,3447,6/7/2021 12:37,male,1,1953,3 -1.2438,1.218,1.2912,1.199,3447,6/7/2021 12:35,male,1,1953,3 -1.2734,1.1316,1.3564,1.2892,3447,6/7/2021 12:38,male,1,1953,3 -1.1348,1.2886,1.1342,1.265,3447,6/7/2021 12:36,male,1,1953,3 -1.1964,1.2754,1.299,1.2686,3447,6/7/2021 12:36,male,1,1953,3 -0.68,1.0448,0.7488,0.8398,3448,6/8/2021 10:22,male,1,1960,3 -0.7584,0.8176,1.0976,1.1856,3448,6/8/2021 10:22,male,1,1960,3 -1.4716,1.6444,1.2524,1.4552,3448,6/8/2021 10:21,male,1,1960,3 -0.8192,1.0816,1.1088,0.5552,3448,6/8/2021 10:23,male,1,1960,3 -0.939,1.4344,1.3562,1.409,3448,6/8/2021 10:21,male,1,1960,3 -0.7232,1.11175,0.6208,1.1136,3449,6/8/2021 11:17,female,1,1959,3 -0.8,1.79933333,0.8154,0.9864,3449,6/8/2021 11:56,female,1,1959,3 -0.9018,1.2248,0.9128,1.3276,3449,6/8/2021 11:56,female,1,1959,3 -1.0396,1.364,0.958,1.1146,3449,6/8/2021 11:16,female,1,1959,3 -1.1614,1.2182,0.7568,1.113,3449,6/8/2021 11:57,female,1,1959,3 -1.3086,1.4116,1.2974,1.2128,3450,6/11/2021 8:36,female,1,1959,3 -0.6414,1.0366,0.8142,0.9758,3450,6/11/2021 8:38,female,1,1959,3 -1.0832,1.2176,0.9932,1.094,3450,6/11/2021 8:36,female,1,1959,3 -1.051,1.0448,1.2332,1.3438,3450,6/11/2021 8:37,female,1,1959,3 -0.8982,1.1144,1.1116,1.0814,3450,6/11/2021 8:37,female,1,1959,3 -0.7346,0.6836,0.9658,0.9098,3453,6/24/2021 8:32,male,1,1990,4 -0.9146,0.8366,0.7562,0.8352,3453,6/21/2021 14:09,male,1,1990,4 -0.6144,0.7612,0.7432,0.716,3453,6/25/2021 12:35,male,1,1990,4 -0.726,0.7042,0.6618,0.6264,3453,6/22/2021 8:38,male,1,1990,4 -0.7562,1.1188,0.545,0.5814,3453,6/26/2021 11:22,male,1,1990,4 -0.6874,0.662,0.7174,0.905,3453,6/23/2021 7:45,male,1,1990,4 -0.7906,0.8926,0.7244,1.1148,3453,6/27/2021 15:03,male,1,1990,4 -1.22825,1.592,1.13925,1.37766667,3454,6/27/2021 11:44,male,1,1991,3 -2.36,2.4208,2.564,1.822,3455,6/29/2021 15:14,female,1,1960,1 -2.1704,1.5394,1.8284,1.6858,3456,6/29/2021 15:27,male,1,1958,2 -2.5528,2.5938,2.7084,2.0998,3457,6/29/2021 15:41,female,1,1959,1 -3.1008,1.795,1.6702,1.9114,3458,6/29/2021 15:56,male,1,1960,3 -0.8972,1.0564,1.237,1.233,3461,9/9/2021 18:23,male,1,1992,3 diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/csv/testdata.csv b/dbrepo-identifier-service/rest-service/src/test/resources/csv/testdata.csv deleted file mode 100644 index f747eb5bd6..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/csv/testdata.csv +++ /dev/null @@ -1,1001 +0,0 @@ -id;Date;Location;MinTemp;MaxTemp;Rainfall -1;2008-12-01;Albury;13.4;22.9;0.6 -2;2008-12-02;Albury;7.4;25.1;0 -3;2008-12-03;Albury;12.9;25.7;0 -4;2008-12-04;Albury;9.2;28;0 -5;2008-12-05;Albury;17.5;32.3;1 -6;2008-12-06;Albury;14.6;29.7;0.2 -7;2008-12-07;Albury;14.3;25;0 -8;2008-12-08;Albury;7.7;26.7;0 -9;2008-12-09;Albury;9.7;31.9;0 -10;2008-12-10;Albury;13.1;30.1;1.4 -11;2008-12-11;Albury;13.4;30.4;0 -12;2008-12-12;Albury;15.9;21.7;2.2 -13;2008-12-13;Albury;15.9;18.6;15.6 -14;2008-12-14;Albury;12.6;21;3.6 -15;2008-12-15;Albury;8.4;24.6;0 -16;2008-12-16;Albury;9.8;27.7;NA -17;2008-12-17;Albury;14.1;20.9;0 -18;2008-12-18;Albury;13.5;22.9;16.8 -19;2008-12-19;Albury;11.2;22.5;10.6 -20;2008-12-20;Albury;9.8;25.6;0 -21;2008-12-21;Albury;11.5;29.3;0 -22;2008-12-22;Albury;17.1;33;0 -23;2008-12-23;Albury;20.5;31.8;0 -24;2008-12-24;Albury;15.3;30.9;0 -25;2008-12-25;Albury;12.6;32.4;0 -26;2008-12-26;Albury;16.2;33.9;0 -27;2008-12-27;Albury;16.9;33;0 -28;2008-12-28;Albury;20.1;32.7;0 -29;2008-12-29;Albury;19.7;27.2;0 -30;2008-12-30;Albury;12.5;24.2;1.2 -31;2008-12-31;Albury;12;24.4;0.8 -32;2009-01-01;Albury;11.3;26.5;0 -33;2009-01-02;Albury;9.6;23.9;0 -34;2009-01-03;Albury;10.5;28.8;0 -35;2009-01-04;Albury;12.3;34.6;0 -36;2009-01-05;Albury;12.9;35.8;0 -37;2009-01-06;Albury;13.7;37.9;0 -38;2009-01-07;Albury;16.1;38.9;0 -39;2009-01-08;Albury;14;28.3;0 -40;2009-01-09;Albury;12.5;28.4;0 -41;2009-01-10;Albury;17;30.8;0 -42;2009-01-11;Albury;16.9;32;0 -43;2009-01-12;Albury;17.3;34.7;0 -44;2009-01-13;Albury;17.2;37.7;0 -45;2009-01-14;Albury;17.4;43;0 -46;2009-01-15;Albury;19.8;32.7;0 -47;2009-01-16;Albury;14.9;26.7;0 -48;2009-01-17;Albury;10.5;28.4;0 -49;2009-01-18;Albury;11.3;32.2;0 -50;2009-01-19;Albury;13.9;36.6;0 -51;2009-01-20;Albury;18.6;39.9;0 -52;2009-01-21;Albury;19.3;38.1;0.8 -53;2009-01-22;Albury;24.4;34;0.6 -54;2009-01-23;Albury;18.8;35.2;6.4 -55;2009-01-24;Albury;20.8;30.6;0 -56;2009-01-25;Albury;14;34.3;0 -57;2009-01-26;Albury;15.7;38.4;0 -58;2009-01-27;Albury;18.5;38.2;0 -59;2009-01-28;Albury;20.4;40.7;0 -60;2009-01-29;Albury;21.8;41.5;0 -61;2009-01-30;Albury;22.3;42.9;0 -62;2009-01-31;Albury;22;42.7;0 -63;2009-02-01;Albury;28;43.1;0 -64;2009-02-02;Albury;24.4;38.3;0.2 -65;2009-02-03;Albury;21.5;37.7;0 -66;2009-02-04;Albury;21.7;36.9;0 -67;2009-02-05;Albury;21.5;41.2;0 -68;2009-02-06;Albury;23.5;42.2;0 -69;2009-02-07;Albury;22.3;44.8;0 -70;2009-02-08;Albury;28.3;40.2;0 -71;2009-02-09;Albury;18.4;31.2;0.4 -72;2009-02-10;Albury;14.9;27.3;0 -73;2009-02-11;Albury;13.5;26.7;0 -74;2009-02-12;Albury;16.1;21.6;0 -75;2009-02-13;Albury;14.6;29;3 -76;2009-02-14;Albury;12.4;29.2;0 -77;2009-02-15;Albury;13.3;31.3;0 -78;2009-02-16;Albury;17.2;31.1;0 -79;2009-02-17;Albury;12.5;28.8;0 -80;2009-02-18;Albury;18;32;0 -81;2009-02-19;Albury;16.2;34;0 -82;2009-02-20;Albury;18.7;29.1;0 -83;2009-02-21;Albury;13.7;31.7;0 -84;2009-02-22;Albury;15.5;33.2;0 -85;2009-02-23;Albury;14.3;34;0 -86;2009-02-24;Albury;12.9;29.6;0 -87;2009-02-25;Albury;8.9;31.9;0 -88;2009-02-26;Albury;15;32.7;0 -89;2009-02-27;Albury;15.4;32.6;0 -90;2009-02-28;Albury;16;34.5;0 -91;2009-03-01;Albury;12.8;30.3;0 -92;2009-03-02;Albury;13.2;31.9;0 -93;2009-03-03;Albury;18;31.1;0 -94;2009-03-04;Albury;13.8;22.1;0.2 -95;2009-03-05;Albury;11.5;22;0 -96;2009-03-06;Albury;7.6;24;0 -97;2009-03-07;Albury;8.3;27.9;0 -98;2009-03-08;Albury;11;30.2;0 -99;2009-03-09;Albury;13.8;31.8;0 -100;2009-03-10;Albury;15.5;32;0 -101;2009-03-11;Albury;18.4;30.5;1.2 -102;2009-03-12;Albury;20.9;25.7;0 -103;2009-03-13;Albury;17.1;25.8;5.8 -104;2009-03-14;Albury;16.4;27;3 -105;2009-03-15;Albury;10;19.7;11.6 -106;2009-03-16;Albury;8.8;21.9;0 -107;2009-03-17;Albury;8.4;25.3;0 -108;2009-03-18;Albury;9.3;28;0 -109;2009-03-19;Albury;11.3;30.1;0 -110;2009-03-20;Albury;11.5;33.5;0 -111;2009-03-21;Albury;13.8;33.6;0 -112;2009-03-22;Albury;14.6;30;0 -113;2009-03-23;Albury;14.4;31.6;0 -114;2009-03-24;Albury;10.8;31.9;0 -115;2009-03-25;Albury;15.4;22.3;0.4 -116;2009-03-26;Albury;13.3;29.8;1.8 -117;2009-03-27;Albury;10.1;27.6;0 -118;2009-03-28;Albury;9.1;28.9;0 -119;2009-03-29;Albury;10.4;31.2;0 -120;2009-03-30;Albury;13.4;30.4;0 -121;2009-03-31;Albury;12.3;29.9;0 -122;2009-04-01;Albury;12.2;30.6;0 -123;2009-04-02;Albury;14.3;32.1;0 -124;2009-04-03;Albury;18.4;28.1;8.6 -125;2009-04-04;Albury;10.7;21.4;12.6 -126;2009-04-05;Albury;7.8;21.7;0 -127;2009-04-06;Albury;8.1;21.4;0 -128;2009-04-07;Albury;7.5;22.5;0 -129;2009-04-08;Albury;8.2;24;0 -130;2009-04-09;Albury;8.1;25.7;0 -131;2009-04-10;Albury;11.6;26.7;0 -132;2009-04-11;Albury;13;24.9;8.4 -133;2009-04-12;Albury;13.5;24.2;6.2 -134;2009-04-13;Albury;9.9;25.4;0 -135;2009-04-14;Albury;12.2;25;0 -136;2009-04-15;Albury;10.7;21.9;0 -137;2009-04-16;Albury;3.5;20;0 -138;2009-04-17;Albury;6.6;21.6;0 -139;2009-04-18;Albury;7;23.4;0 -140;2009-04-19;Albury;11.2;23.9;0 -141;2009-04-20;Albury;7.4;22;0 -142;2009-04-21;Albury;5.7;21.4;0 -143;2009-04-22;Albury;6.2;22.7;0 -144;2009-04-23;Albury;6;22.9;0 -145;2009-04-24;Albury;10.6;16.2;0 -146;2009-04-25;Albury;12.9;15.8;20 -147;2009-04-26;Albury;8.6;12.9;21 -148;2009-04-27;Albury;4.5;11.5;3.2 -149;2009-04-28;Albury;7.6;14.5;4.8 -150;2009-04-29;Albury;5.4;12.2;0 -151;2009-04-30;Albury;2.1;16.5;0 -152;2009-05-01;Albury;1.8;17;0 -153;2009-05-02;Albury;7.2;19.2;0 -154;2009-05-03;Albury;4.6;18.9;0 -155;2009-05-04;Albury;4.2;19.1;0 -156;2009-05-05;Albury;5.2;18.8;0 -157;2009-05-06;Albury;4.1;19.3;0 -158;2009-05-07;Albury;3.2;18.4;0 -159;2009-05-08;Albury;4.3;19;0 -160;2009-05-09;Albury;3.7;20.5;0 -161;2009-05-10;Albury;5.4;19.5;0 -162;2009-05-11;Albury;4.3;17.7;0 -163;2009-05-12;Albury;3.6;18.5;0 -164;2009-05-13;Albury;3.6;15.1;0 -165;2009-05-14;Albury;6.9;16.3;0 -166;2009-05-15;Albury;10.3;16.6;0 -167;2009-05-16;Albury;12.4;16.4;1.8 -168;2009-05-17;Albury;3;15.6;0 -169;2009-05-18;Albury;2.6;19.7;0 -170;2009-05-19;Albury;3.7;19.1;0 -171;2009-05-20;Albury;5.1;18.6;0 -172;2009-05-21;Albury;4.4;19.8;0 -173;2009-05-22;Albury;4.7;19.8;0 -174;2009-05-23;Albury;6.2;22.9;0 -175;2009-05-24;Albury;6.7;21.1;0 -176;2009-05-25;Albury;9.3;20.3;0 -177;2009-05-26;Albury;11.6;18.1;4.2 -178;2009-05-27;Albury;8;16.2;0.8 -179;2009-05-28;Albury;2.6;15.7;0 -180;2009-05-29;Albury;2.2;16.5;0 -181;2009-05-30;Albury;2.2;16.8;0 -182;2009-05-31;Albury;1.7;17.1;0 -183;2009-06-01;Albury;8;14.3;1.2 -184;2009-06-02;Albury;8.4;13.4;1.4 -185;2009-06-03;Albury;10.6;14.3;4.8 -186;2009-06-04;Albury;8.9;17.4;8 -187;2009-06-05;Albury;2.8;16.1;0 -188;2009-06-06;Albury;1.7;10.5;0.2 -189;2009-06-07;Albury;4.7;11.6;14.4 -190;2009-06-08;Albury;9;12;4.6 -191;2009-06-09;Albury;6.3;8.8;2 -192;2009-06-10;Albury;3;10.5;5.6 -193;2009-06-11;Albury;-2;9.6;0 -194;2009-06-12;Albury;-1.3;8.2;0 -195;2009-06-13;Albury;1.8;12.4;0 -196;2009-06-14;Albury;2;15.8;0 -197;2009-06-15;Albury;0.5;14.9;0.4 -198;2009-06-16;Albury;1.2;17.7;0 -199;2009-06-17;Albury;0.6;15.9;0 -200;2009-06-18;Albury;0.5;14.7;0 -201;2009-06-19;Albury;0.5;15.3;0 -202;2009-06-20;Albury;0.9;17.3;0 -203;2009-06-21;Albury;7;17;1.6 -204;2009-06-22;Albury;5;14.9;5.6 -205;2009-06-23;Albury;3.9;15.5;0 -206;2009-06-24;Albury;7.7;14.1;6 -207;2009-06-25;Albury;4.7;12.2;0 -208;2009-06-26;Albury;6.9;13.7;4.4 -209;2009-06-27;Albury;8.4;11.9;0 -210;2009-06-28;Albury;9.3;12.3;5.4 -211;2009-06-29;Albury;8.2;15.7;3.6 -212;2009-06-30;Albury;9.1;16.1;2 -213;2009-07-01;Albury;8.3;13.3;8.4 -214;2009-07-02;Albury;8.8;11.6;5 -215;2009-07-03;Albury;7.6;12;7.8 -216;2009-07-04;Albury;5.7;13.2;0 -217;2009-07-05;Albury;3.4;12.4;0 -218;2009-07-06;Albury;0;12.1;0 -219;2009-07-07;Albury;-1.5;12.5;0 -220;2009-07-08;Albury;-1.7;13.8;0 -221;2009-07-09;Albury;-0.4;15;0.2 -222;2009-07-10;Albury;0.1;13.5;0 -223;2009-07-11;Albury;4.8;13.3;0.6 -224;2009-07-12;Albury;8.1;16.5;0.6 -225;2009-07-13;Albury;5.9;13.1;1 -226;2009-07-14;Albury;6.9;11;6.8 -227;2009-07-15;Albury;2.9;12.6;1.8 -228;2009-07-16;Albury;-0.6;13.4;0 -229;2009-07-17;Albury;-0.3;14.4;0.2 -230;2009-07-18;Albury;-1;12;0 -231;2009-07-19;Albury;3.2;14.1;0.6 -232;2009-07-20;Albury;3.6;16.5;0.2 -233;2009-07-21;Albury;0.8;17.7;0 -234;2009-07-22;Albury;6.6;12.3;0 -235;2009-07-23;Albury;6;13.5;9.8 -236;2009-07-24;Albury;-0.1;12.9;0 -237;2009-07-25;Albury;-0.3;12.2;0 -238;2009-07-26;Albury;2.1;9.8;0 -239;2009-07-27;Albury;1.3;8.8;0 -240;2009-07-28;Albury;4.2;12.7;3.8 -241;2009-07-29;Albury;8.3;13.2;2.4 -242;2009-07-30;Albury;3.3;12.1;0.2 -243;2009-07-31;Albury;6.5;14.5;5.2 -244;2009-08-01;Albury;7.4;13.9;0.2 -245;2009-08-02;Albury;7.5;14.1;0.8 -246;2009-08-03;Albury;8.3;13.8;0.8 -247;2009-08-04;Albury;3.2;14.7;0 -248;2009-08-05;Albury;5.7;13.8;5.4 -249;2009-08-06;Albury;5.1;17.1;0.4 -250;2009-08-07;Albury;8;13.9;0.8 -251;2009-08-08;Albury;-0.8;12.9;4.2 -252;2009-08-09;Albury;-1;12.2;0 -253;2009-08-10;Albury;1.9;14.8;0.2 -254;2009-08-11;Albury;5.9;17.7;0.4 -255;2009-08-12;Albury;6.9;14.3;4.8 -256;2009-08-13;Albury;7.7;11.6;0.2 -257;2009-08-14;Albury;6.8;15.2;1.2 -258;2009-08-15;Albury;2.7;17.5;0.2 -259;2009-08-16;Albury;5.1;15.5;1.6 -260;2009-08-17;Albury;4.2;13.6;3.2 -261;2009-08-18;Albury;0.6;15.6;0 -262;2009-08-19;Albury;1.6;16.4;0 -263;2009-08-20;Albury;5.5;18.4;0 -264;2009-08-21;Albury;7.3;14.8;1 -265;2009-08-22;Albury;0.2;14.1;6.6 -266;2009-08-23;Albury;5.8;18.9;3.8 -267;2009-08-24;Albury;8.9;17.1;1.2 -268;2009-08-25;Albury;7.1;12.8;2 -269;2009-08-26;Albury;4.2;14.4;3.6 -270;2009-08-27;Albury;1.1;16.7;0.4 -271;2009-08-28;Albury;1.1;18.6;0 -272;2009-08-29;Albury;7.2;17.9;4.2 -273;2009-08-30;Albury;6.3;11.1;13.4 -274;2009-08-31;Albury;6.7;14.2;1.4 -275;2009-09-01;Albury;5.1;14.2;3 -276;2009-09-02;Albury;1;16.8;0 -277;2009-09-03;Albury;6.1;20.7;0 -278;2009-09-04;Albury;6.3;16.9;1.4 -279;2009-09-05;Albury;2.1;15;0 -280;2009-09-06;Albury;1.6;16.6;0 -281;2009-09-07;Albury;8.3;17.6;0 -282;2009-09-08;Albury;5.7;16.5;0 -283;2009-09-09;Albury;7.5;14.3;0 -284;2009-09-10;Albury;2.6;NA;0 -285;2009-09-11;Albury;NA;18.8;NA -286;2009-09-12;Albury;6.5;24.7;0 -287;2009-09-13;Albury;13.2;25.1;0 -288;2009-09-14;Albury;4.3;17.8;0 -289;2009-09-15;Albury;1.6;17.2;0 -290;2009-09-16;Albury;2.8;21.1;0 -291;2009-09-17;Albury;6.3;19;0 -292;2009-09-18;Albury;7.4;20.4;10.2 -293;2009-09-19;Albury;5.4;20.6;0 -294;2009-09-20;Albury;8;18.9;0.4 -295;2009-09-21;Albury;3.7;19;0.2 -296;2009-09-22;Albury;11.5;20.2;8.4 -297;2009-09-23;Albury;9.3;16.8;28.8 -298;2009-09-24;Albury;8.2;18.2;1.4 -299;2009-09-25;Albury;5.3;20.6;0 -300;2009-09-26;Albury;6.8;12.2;6 -301;2009-09-27;Albury;4.5;12.9;1.6 -302;2009-09-28;Albury;5.5;17.9;0 -303;2009-09-29;Albury;1.7;17;0 -304;2009-09-30;Albury;4;21.4;0 -305;2009-10-01;Albury;8.9;21.1;0 -306;2009-10-02;Albury;11.7;22;0 -307;2009-10-03;Albury;8.5;13.5;3.2 -308;2009-10-04;Albury;9.6;16.2;1.8 -309;2009-10-05;Albury;8.3;19.7;0.2 -310;2009-10-06;Albury;5.2;16.2;0 -311;2009-10-07;Albury;3.8;15.9;3.6 -312;2009-10-08;Albury;1.2;16.3;0 -313;2009-10-09;Albury;3.2;18.2;0 -314;2009-10-10;Albury;4.6;19;0 -315;2009-10-11;Albury;6.4;18.7;0 -316;2009-10-12;Albury;5.8;23.3;0 -317;2009-10-13;Albury;6.6;17.7;2 -318;2009-10-14;Albury;9.5;15.1;7 -319;2009-10-15;Albury;9.7;15.7;1.4 -320;2009-10-16;Albury;4.1;16.6;6.8 -321;2009-10-17;Albury;4.6;19.2;0 -322;2009-10-18;Albury;5.1;20.3;0 -323;2009-10-19;Albury;5.1;22.7;0 -324;2009-10-20;Albury;6.9;26.6;0 -325;2009-10-21;Albury;8.8;27.1;0 -326;2009-10-22;Albury;9.1;27.1;0 -327;2009-10-23;Albury;8.1;23.9;0 -328;2009-10-24;Albury;7.4;25.4;0 -329;2009-10-25;Albury;10.6;23.1;0 -330;2009-10-26;Albury;10.8;22;0 -331;2009-10-27;Albury;5.9;24.1;0 -332;2009-10-28;Albury;11.3;26.8;0 -333;2009-10-29;Albury;14.5;26.9;0 -334;2009-10-30;Albury;13.7;29.1;0 -335;2009-10-31;Albury;15.6;30.8;0 -336;2009-11-01;Albury;17.8;34;0 -337;2009-11-02;Albury;18.7;32.4;0 -338;2009-11-03;Albury;18.7;24.3;0 -339;2009-11-04;Albury;10;23.2;0 -340;2009-11-05;Albury;6.6;25.3;0 -341;2009-11-06;Albury;10.8;27.9;0 -342;2009-11-07;Albury;11.3;29.8;0 -343;2009-11-08;Albury;13.5;31.8;0 -344;2009-11-09;Albury;15.4;33.4;0 -345;2009-11-10;Albury;15.9;35.2;0 -346;2009-11-11;Albury;17.1;36;0 -347;2009-11-12;Albury;16.7;35.1;0 -348;2009-11-13;Albury;18.1;32.8;0 -349;2009-11-14;Albury;13.4;35.4;0 -350;2009-11-15;Albury;17.2;36.3;0 -351;2009-11-16;Albury;15.3;35.1;0 -352;2009-11-17;Albury;12.1;30.5;0 -353;2009-11-18;Albury;11.4;33.5;0 -354;2009-11-19;Albury;18.6;39.7;0 -355;2009-11-20;Albury;15.3;38.2;0 -356;2009-11-21;Albury;19.3;21;10.6 -357;2009-11-22;Albury;18.3;28.3;25.8 -358;2009-11-23;Albury;11.9;23.6;0.4 -359;2009-11-24;Albury;12.8;25.8;0 -360;2009-11-25;Albury;17.2;32.9;0 -361;2009-11-26;Albury;21;34.5;0 -362;2009-11-27;Albury;15.9;26.2;10.2 -363;2009-11-28;Albury;17.1;26.4;0 -364;2009-11-29;Albury;12.8;22.3;9.4 -365;2009-11-30;Albury;13.2;23.9;2.4 -366;2009-12-01;Albury;12.3;23.6;0 -367;2009-12-02;Albury;10.6;27;0 -368;2009-12-03;Albury;11.4;31.5;0 -369;2009-12-04;Albury;12.3;27.5;0 -370;2009-12-05;Albury;10.7;26.7;0 -371;2009-12-06;Albury;11.1;30.7;0 -372;2009-12-07;Albury;13.4;31.9;0 -373;2009-12-08;Albury;18.2;24.9;0 -374;2009-12-09;Albury;9.2;25.4;1.2 -375;2009-12-10;Albury;14.2;27.4;0 -376;2009-12-11;Albury;9.2;22.6;1 -377;2009-12-12;Albury;9;26.5;0 -378;2009-12-13;Albury;11.8;29.6;0 -379;2009-12-14;Albury;13.6;32;0 -380;2009-12-15;Albury;13.1;34.7;0 -381;2009-12-16;Albury;14.6;38.6;0 -382;2009-12-17;Albury;14.5;40.3;0 -383;2009-12-18;Albury;12.2;26.4;3 -384;2009-12-19;Albury;11.1;29.2;0 -385;2009-12-20;Albury;12;31.3;0 -386;2009-12-21;Albury;12.7;33.7;0 -387;2009-12-22;Albury;15.1;36.6;0 -388;2009-12-23;Albury;18.1;38.2;0 -389;2009-12-24;Albury;22.9;34.6;0 -390;2009-12-25;Albury;18.8;28.3;9.8 -391;2009-12-26;Albury;17.1;31.3;0 -392;2009-12-27;Albury;17.6;27.3;0 -393;2009-12-28;Albury;17.8;35.9;0 -394;2009-12-29;Albury;18.7;35.9;0 -395;2009-12-30;Albury;19.8;36.8;0 -396;2009-12-31;Albury;21.1;33.2;0 -397;2010-01-01;Albury;19.4;31.9;5 -398;2010-01-02;Albury;18.6;29.1;12.4 -399;2010-01-03;Albury;12.2;29.7;0 -400;2010-01-04;Albury;14.8;32.8;0 -401;2010-01-05;Albury;15;35.8;0 -402;2010-01-06;Albury;16.3;33.8;0 -403;2010-01-07;Albury;15;33;0 -404;2010-01-08;Albury;17.4;36.4;0 -405;2010-01-09;Albury;19.6;39.8;0 -406;2010-01-10;Albury;20.6;42.2;0 -407;2010-01-11;Albury;21;42.2;0 -408;2010-01-12;Albury;24.5;42.4;0.2 -409;2010-01-13;Albury;22.6;28.4;0.4 -410;2010-01-14;Albury;15.7;31.7;3 -411;2010-01-15;Albury;17.2;36.3;0 -412;2010-01-16;Albury;21.8;36.6;0 -413;2010-01-17;Albury;16.8;25.6;0 -414;2010-01-18;Albury;10.5;22.6;0 -415;2010-01-19;Albury;8.7;25.2;0 -416;2010-01-20;Albury;11;32.9;0 -417;2010-01-21;Albury;15.4;37.3;0 -418;2010-01-22;Albury;19.2;41.8;0 -419;2010-01-23;Albury;24.7;35.4;0 -420;2010-01-24;Albury;14.4;33.7;0 -421;2010-01-25;Albury;14.3;35.8;0 -422;2010-01-26;Albury;15.1;35.9;0 -423;2010-01-27;Albury;17.7;36.4;0 -424;2010-01-28;Albury;15.2;34.4;0 -425;2010-01-29;Albury;16;35.2;0 -426;2010-01-30;Albury;18.9;36.5;0 -427;2010-01-31;Albury;21.7;36.3;0 -428;2010-02-01;Albury;21;38.2;0 -429;2010-02-02;Albury;17.8;34.3;8.6 -430;2010-02-03;Albury;17.9;35.6;0 -431;2010-02-04;Albury;23.5;32;0 -432;2010-02-05;Albury;19.2;26.1;52.2 -433;2010-02-06;Albury;19.5;30.3;5.6 -434;2010-02-07;Albury;20.3;33.9;0 -435;2010-02-08;Albury;23;34;0 -436;2010-02-09;Albury;22.1;35.1;0 -437;2010-02-10;Albury;21.7;35.6;NA -438;2010-02-11;Albury;21.5;35;0 -439;2010-02-12;Albury;22.5;29.1;NA -440;2010-02-13;Albury;20.8;27.1;0 -441;2010-02-14;Albury;20.5;30.3;0 -442;2010-02-15;Albury;17.8;26.8;0 -443;2010-02-16;Albury;17.6;29;0 -444;2010-02-17;Albury;15.5;30.6;0 -445;2010-02-18;Albury;NA;31.2;NA -446;2010-02-19;Albury;16.4;30.3;0 -447;2010-02-20;Albury;15.7;31.8;0 -448;2010-02-21;Albury;19.6;34.7;0.6 -449;2010-02-22;Albury;20.2;26.4;3.6 -450;2010-02-23;Albury;12.5;26.1;0.2 -451;2010-02-24;Albury;12.8;28.5;0 -452;2010-02-25;Albury;15;31;0 -453;2010-02-26;Albury;17.2;NA;0 -454;2010-02-27;Albury;NA;26.3;NA -455;2010-02-28;Albury;18.2;29.3;1.4 -456;2010-03-01;Albury;14.4;NA;0 -457;2010-03-02;Albury;11.2;28.5;NA -458;2010-03-03;Albury;12.5;31.2;0 -459;2010-03-04;Albury;15.1;NA;0 -460;2010-03-05;Albury;NA;22.3;0 -461;2010-03-06;Albury;18.8;30.3;20.6 -462;2010-03-07;Albury;18.3;22.9;5.8 -463;2010-03-08;Albury;18.1;25.5;66 -464;2010-03-09;Albury;15.7;22.4;6.2 -465;2010-03-10;Albury;8.8;NA;0 -466;2010-03-11;Albury;12.3;24.4;NA -467;2010-03-12;Albury;10.6;25;0 -468;2010-03-13;Albury;11.5;25.7;0 -469;2010-03-14;Albury;12.2;26.3;0 -470;2010-03-15;Albury;13.2;26.6;0 -471;2010-03-16;Albury;12.5;28.6;0 -472;2010-03-17;Albury;13.3;29.6;0 -473;2010-03-18;Albury;15.1;30.4;0 -474;2010-03-19;Albury;14.9;31.4;0 -475;2010-03-20;Albury;16.7;31.9;0 -476;2010-03-21;Albury;16.8;25.6;0 -477;2010-03-22;Albury;9.1;25.3;0 -478;2010-03-23;Albury;8.3;27;0 -479;2010-03-24;Albury;10.5;28.8;0 -480;2010-03-25;Albury;11.6;29.6;0 -481;2010-03-26;Albury;12.6;30;0 -482;2010-03-27;Albury;15.6;30.2;0 -483;2010-03-28;Albury;17.2;28.7;0 -484;2010-03-29;Albury;18.2;26.3;11 -485;2010-03-30;Albury;16.5;26.9;0.4 -486;2010-03-31;Albury;13.4;26.1;0 -487;2010-04-01;Albury;11.6;25.8;0 -488;2010-04-02;Albury;10;25.1;0 -489;2010-04-03;Albury;12.4;24.8;0 -490;2010-04-04;Albury;12.5;24.8;0 -491;2010-04-05;Albury;10.3;25.3;0 -492;2010-04-06;Albury;10.6;24.7;0 -493;2010-04-07;Albury;15.7;23.4;3 -494;2010-04-08;Albury;13.5;23.1;3.2 -495;2010-04-09;Albury;10.1;21.9;0 -496;2010-04-10;Albury;14.1;18.6;0.2 -497;2010-04-11;Albury;14.2;18.7;7 -498;2010-04-12;Albury;5.6;17.4;0 -499;2010-04-13;Albury;4.6;19.9;0 -500;2010-04-14;Albury;5.1;21.9;0 -501;2010-04-15;Albury;6.1;23.5;0 -502;2010-04-16;Albury;7.7;24.7;0 -503;2010-04-17;Albury;8.5;25.4;0 -504;2010-04-18;Albury;10.1;25.1;0 -505;2010-04-19;Albury;11.2;25.9;0 -506;2010-04-20;Albury;11.8;25.2;0 -507;2010-04-21;Albury;12.3;27.5;0 -508;2010-04-22;Albury;11.4;27.3;0 -509;2010-04-23;Albury;11.3;29;0 -510;2010-04-24;Albury;15.4;19.8;3.6 -511;2010-04-25;Albury;10.8;18.5;17 -512;2010-04-26;Albury;5.1;17.9;0 -513;2010-04-27;Albury;7.1;16.1;0 -514;2010-04-28;Albury;9.7;17.3;1.6 -515;2010-04-29;Albury;10.5;17.7;0.4 -516;2010-04-30;Albury;5.6;19.1;0 -517;2010-05-01;Albury;5.9;21.1;0.2 -518;2010-05-02;Albury;4.8;20.7;0 -519;2010-05-03;Albury;6.8;23;0 -520;2010-05-04;Albury;8;25.3;0.2 -521;2010-05-05;Albury;8.9;14.5;3 -522;2010-05-06;Albury;7.1;15.3;0 -523;2010-05-07;Albury;5.7;17.5;0 -524;2010-05-08;Albury;9.6;19.3;0 -525;2010-05-09;Albury;5.7;19.5;0 -526;2010-05-10;Albury;5;19.8;0 -527;2010-05-11;Albury;3;15.6;0 -528;2010-05-12;Albury;1.3;14.9;0 -529;2010-05-13;Albury;1;17.1;0 -530;2010-05-14;Albury;3.1;17.7;0.2 -531;2010-05-15;Albury;2.2;18.4;0 -532;2010-05-16;Albury;1.7;17.5;0 -533;2010-05-17;Albury;4.5;17;0 -534;2010-05-18;Albury;1.6;19.7;0 -535;2010-05-19;Albury;1.4;18.5;0 -536;2010-05-20;Albury;2.1;16.5;0 -537;2010-05-21;Albury;1.7;17.9;0 -538;2010-05-22;Albury;1.1;17.1;0 -539;2010-05-23;Albury;0.9;18.1;0 -540;2010-05-24;Albury;5.2;16.3;0 -541;2010-05-25;Albury;10.2;14.9;10.4 -542;2010-05-26;Albury;8.4;19;13.4 -543;2010-05-27;Albury;5.7;16.6;0.2 -544;2010-05-28;Albury;6.4;17;0 -545;2010-05-29;Albury;9.4;15;28 -546;2010-05-30;Albury;8.8;20.2;5.8 -547;2010-05-31;Albury;10.7;19.1;0 -548;2010-06-01;Albury;4.2;16.6;0 -549;2010-06-02;Albury;4.3;17.7;0 -550;2010-06-03;Albury;3.4;17.7;0 -551;2010-06-04;Albury;3.1;18.4;0 -552;2010-06-05;Albury;1.7;10.2;0 -553;2010-06-06;Albury;5;15.8;0 -554;2010-06-07;Albury;0.4;14;0 -555;2010-06-08;Albury;3.1;12.2;0 -556;2010-06-09;Albury;5.3;8.4;0 -557;2010-06-10;Albury;4.9;12.9;2.4 -558;2010-06-11;Albury;7.2;13.2;0 -559;2010-06-12;Albury;0;13.3;0 -560;2010-06-13;Albury;-1;13.1;0 -561;2010-06-14;Albury;-2;13.2;0 -562;2010-06-15;Albury;-0.3;12.8;0 -563;2010-06-16;Albury;1.5;15.5;0 -564;2010-06-17;Albury;7.4;16.2;11.6 -565;2010-06-18;Albury;3;12.2;2.2 -566;2010-06-19;Albury;6.9;15.2;1.8 -567;2010-06-20;Albury;3.6;13.1;0 -568;2010-06-21;Albury;5;12.5;0.4 -569;2010-06-22;Albury;3;14.8;0 -570;2010-06-23;Albury;3.5;16.5;0 -571;2010-06-24;Albury;3.4;17;0 -572;2010-06-25;Albury;7;16.1;0 -573;2010-06-26;Albury;6.2;12.1;10.2 -574;2010-06-27;Albury;0.6;11.9;0.2 -575;2010-06-28;Albury;-0.6;8.3;0 -576;2010-06-29;Albury;2.3;9.4;0 -577;2010-06-30;Albury;5.1;9.8;0.2 -578;2010-07-01;Albury;3.2;11.9;1.2 -579;2010-07-02;Albury;0.2;10.9;0.2 -580;2010-07-03;Albury;1;10.3;0 -581;2010-07-04;Albury;1.5;10.8;0 -582;2010-07-05;Albury;1.8;12.1;0.2 -583;2010-07-06;Albury;2.3;13.9;5.6 -584;2010-07-07;Albury;1.5;13.5;0 -585;2010-07-08;Albury;2.1;14.8;0.4 -586;2010-07-09;Albury;0;14.6;0 -587;2010-07-10;Albury;1.5;16.1;0 -588;2010-07-11;Albury;5;15.4;13.4 -589;2010-07-12;Albury;3.5;15.3;0.2 -590;2010-07-13;Albury;3.5;16.3;0 -591;2010-07-14;Albury;6.2;10;21.4 -592;2010-07-15;Albury;3.4;12.2;11 -593;2010-07-16;Albury;0.6;13.1;0 -594;2010-07-17;Albury;-0.4;11.5;0 -595;2010-07-18;Albury;0.7;12.8;0 -596;2010-07-19;Albury;5;13.5;1.6 -597;2010-07-20;Albury;0.5;11.6;0.2 -598;2010-07-21;Albury;0.6;12.9;0 -599;2010-07-22;Albury;-0.5;13.8;0 -600;2010-07-23;Albury;0.1;15.7;0 -601;2010-07-24;Albury;1;14.6;0 -602;2010-07-25;Albury;2.5;14.3;0.2 -603;2010-07-26;Albury;1.9;14.9;0.2 -604;2010-07-27;Albury;-1.2;15;0.2 -605;2010-07-28;Albury;2.1;12.6;0 -606;2010-07-29;Albury;5.8;14.8;6.2 -607;2010-07-30;Albury;8.9;14.9;0 -608;2010-07-31;Albury;7.5;12.3;2.2 -609;2010-08-01;Albury;7.5;10.1;4.2 -610;2010-08-02;Albury;5.4;14.7;18.6 -611;2010-08-03;Albury;1.2;15.7;0 -612;2010-08-04;Albury;1.2;9.6;0 -613;2010-08-05;Albury;NA;11.8;NA -614;2010-08-06;Albury;0.7;12.6;0.2 -615;2010-08-07;Albury;-0.6;13.1;0.2 -616;2010-08-08;Albury;-1.3;12.6;0 -617;2010-08-09;Albury;0.3;15.5;0 -618;2010-08-10;Albury;4.4;16;7.2 -619;2010-08-11;Albury;7.2;10.4;8.2 -620;2010-08-12;Albury;4.5;14.9;10.8 -621;2010-08-13;Albury;1.6;15;0 -622;2010-08-14;Albury;3.2;13;0 -623;2010-08-15;Albury;7.2;12.1;1.8 -624;2010-08-16;Albury;6.4;11.8;10.2 -625;2010-08-17;Albury;-1;12.1;3.8 -626;2010-08-18;Albury;1.3;11.8;0.2 -627;2010-08-19;Albury;5;15.1;15.4 -628;2010-08-20;Albury;4.5;11.7;2 -629;2010-08-21;Albury;6.3;12.9;0 -630;2010-08-22;Albury;2.1;15.3;0.2 -631;2010-08-23;Albury;4.1;12.8;0.2 -632;2010-08-24;Albury;6.4;13.3;1.8 -633;2010-08-25;Albury;4.2;10.7;1.8 -634;2010-08-26;Albury;5.4;11.8;9.6 -635;2010-08-27;Albury;6.8;13.4;4 -636;2010-08-28;Albury;0.9;14.4;0 -637;2010-08-29;Albury;1.9;15.2;0 -638;2010-08-30;Albury;2.3;15.4;0 -639;2010-08-31;Albury;2.9;14.2;0 -640;2010-09-01;Albury;7.1;15.1;0 -641;2010-09-02;Albury;10;16.8;0.8 -642;2010-09-03;Albury;7.1;17.6;0 -643;2010-09-04;Albury;10.1;17.7;21.8 -644;2010-09-05;Albury;9.8;14.2;20.8 -645;2010-09-06;Albury;6.8;12.8;2.4 -646;2010-09-07;Albury;2.3;15.1;1.2 -647;2010-09-08;Albury;1.7;15.9;0 -648;2010-09-09;Albury;7.2;14.7;0 -649;2010-09-10;Albury;8.1;14;24.8 -650;2010-09-11;Albury;2.6;15.9;3.2 -651;2010-09-12;Albury;4.5;16.3;0 -652;2010-09-13;Albury;6;18.7;0.4 -653;2010-09-14;Albury;5.8;19;0 -654;2010-09-15;Albury;5.5;13.6;0 -655;2010-09-16;Albury;7.5;13.4;0 -656;2010-09-17;Albury;4.3;14.3;0.2 -657;2010-09-18;Albury;3.3;13.9;0 -658;2010-09-19;Albury;2.4;16.4;0 -659;2010-09-20;Albury;2.8;18.7;0 -660;2010-09-21;Albury;5;19.6;0 -661;2010-09-22;Albury;8.6;20.1;0 -662;2010-09-23;Albury;5.7;19.9;0 -663;2010-09-24;Albury;3.7;19.1;0 -664;2010-09-25;Albury;5.6;19.7;0 -665;2010-09-26;Albury;5.4;20.6;0 -666;2010-09-27;Albury;6.5;20;0 -667;2010-09-28;Albury;5.4;14.6;0 -668;2010-09-29;Albury;3.7;14.3;0 -669;2010-09-30;Albury;-0.1;14.6;0 -670;2010-10-01;Albury;4.1;17.4;0 -671;2010-10-02;Albury;4.8;21.1;0 -672;2010-10-03;Albury;7.4;23;0 -673;2010-10-04;Albury;8.2;23.2;0 -674;2010-10-05;Albury;10.1;25.9;0 -675;2010-10-06;Albury;11.1;24.9;0 -676;2010-10-07;Albury;7.3;15.9;10 -677;2010-10-08;Albury;4.2;19;0 -678;2010-10-09;Albury;5.4;20.8;0 -679;2010-10-10;Albury;8.2;23.2;0 -680;2010-10-11;Albury;7.6;23.7;0 -681;2010-10-12;Albury;14.5;19.9;0.8 -682;2010-10-13;Albury;14.7;18;11.4 -683;2010-10-14;Albury;12.7;19.1;19 -684;2010-10-15;Albury;13.8;18.6;22.2 -685;2010-10-16;Albury;4.8;12.8;32.8 -686;2010-10-17;Albury;6.3;15.4;0 -687;2010-10-18;Albury;9.2;17.4;0 -688;2010-10-19;Albury;4.8;19;0 -689;2010-10-20;Albury;5.7;21.8;0 -690;2010-10-21;Albury;8;23.3;0 -691;2010-10-22;Albury;9.5;25.8;0 -692;2010-10-23;Albury;14.8;19;0.4 -693;2010-10-24;Albury;8.2;22.2;2.4 -694;2010-10-25;Albury;10.9;22.2;0 -695;2010-10-26;Albury;8.8;23.5;0 -696;2010-10-27;Albury;10.2;22.3;1.6 -697;2010-10-28;Albury;8.8;23.6;0 -698;2010-10-29;Albury;10.3;25.6;0 -699;2010-10-30;Albury;16;19.5;3.4 -700;2010-10-31;Albury;13.8;18.7;50.8 -701;2010-11-01;Albury;10.2;18.9;1.2 -702;2010-11-02;Albury;7.1;20.3;0 -703;2010-11-03;Albury;10.7;18;0 -704;2010-11-04;Albury;10.1;18.8;0 -705;2010-11-05;Albury;11.1;21;0 -706;2010-11-06;Albury;7.5;22.9;0 -707;2010-11-07;Albury;9.3;24.5;0 -708;2010-11-08;Albury;14.7;24.7;2.2 -709;2010-11-09;Albury;11.6;27.7;0 -710;2010-11-10;Albury;15.5;29;0 -711;2010-11-11;Albury;15.2;30.5;0.6 -712;2010-11-12;Albury;17.5;31.3;0 -713;2010-11-13;Albury;21.1;26.9;0 -714;2010-11-14;Albury;19.2;22.6;52.6 -715;2010-11-15;Albury;15.9;23.1;2.4 -716;2010-11-16;Albury;11.4;20.8;0 -717;2010-11-17;Albury;8.8;23.3;0 -718;2010-11-18;Albury;9.1;24.8;0 -719;2010-11-19;Albury;12.1;25.5;0 -720;2010-11-20;Albury;12;27.3;0 -721;2010-11-21;Albury;12.7;29.7;0 -722;2010-11-22;Albury;14.7;29.9;0 -723;2010-11-23;Albury;14.8;29.4;0 -724;2010-11-24;Albury;18.1;30.1;0 -725;2010-11-25;Albury;18.9;27.6;0 -726;2010-11-26;Albury;17.9;24.2;4 -727;2010-11-27;Albury;14.8;27.6;19.2 -728;2010-11-28;Albury;17.8;21.4;18.8 -729;2010-11-29;Albury;13.6;22.6;14.8 -730;2010-11-30;Albury;14.4;23.3;1.6 -731;2010-12-01;Albury;16.7;23.9;12 -732;2010-12-02;Albury;16.1;26.6;0.6 -733;2010-12-03;Albury;15.7;27.3;18.4 -734;2010-12-04;Albury;17.3;29.9;1.2 -735;2010-12-05;Albury;16.6;31.6;0 -736;2010-12-06;Albury;18.9;30.4;0 -737;2010-12-07;Albury;21.3;29.8;0 -738;2010-12-08;Albury;20.3;29.7;3.2 -739;2010-12-09;Albury;18;26.7;25.6 -740;2010-12-10;Albury;16.7;22.5;0 -741;2010-12-11;Albury;11.2;24.3;0 -742;2010-12-12;Albury;15;22.2;0 -743;2010-12-13;Albury;10.5;26.2;0 -744;2010-12-14;Albury;13.7;28.8;0 -745;2010-12-15;Albury;16.1;31.1;0 -746;2010-12-16;Albury;15.1;25.6;0.4 -747;2010-12-17;Albury;10.3;25.9;0 -748;2010-12-18;Albury;14;20.8;1 -749;2010-12-19;Albury;10.4;18;3 -750;2010-12-20;Albury;8.6;20.5;6.2 -751;2010-12-21;Albury;9.9;21.2;1.6 -752;2010-12-22;Albury;9.4;25.9;0 -753;2010-12-23;Albury;12.3;29.2;0 -754;2010-12-24;Albury;13.9;30.8;0 -755;2010-12-25;Albury;19.3;29.1;0 -756;2010-12-26;Albury;17.5;30;1 -757;2010-12-27;Albury;11.3;22.2;0 -758;2010-12-28;Albury;9.1;26.7;0 -759;2010-12-29;Albury;13.5;31;0 -760;2010-12-30;Albury;14.8;34;0 -761;2010-12-31;Albury;15.7;38.1;0 -762;2011-01-01;Albury;23.2;35.8;0 -763;2011-01-02;Albury;20.1;31.1;0.6 -764;2011-01-03;Albury;13.6;29.4;0 -765;2011-01-04;Albury;13.9;29.2;0 -766;2011-01-05;Albury;16;28.9;0 -767;2011-01-06;Albury;16.5;31.6;0 -768;2011-01-07;Albury;16.1;30.7;0 -769;2011-01-08;Albury;17.8;32;0 -770;2011-01-09;Albury;20.1;33;0 -771;2011-01-10;Albury;20.1;32;35 -772;2011-01-11;Albury;21.6;26.4;1.4 -773;2011-01-12;Albury;21.5;28.9;5 -774;2011-01-13;Albury;22.1;30.6;14.2 -775;2011-01-14;Albury;24;25.5;2.4 -776;2011-01-15;Albury;19.9;31.4;13.8 -777;2011-01-16;Albury;18.5;33.7;0 -778;2011-01-17;Albury;19.8;26.9;0 -779;2011-01-18;Albury;12.9;27.2;0 -780;2011-01-19;Albury;12.9;29.3;0 -781;2011-01-20;Albury;16.1;31.9;0 -782;2011-01-21;Albury;17.8;32.5;0 -783;2011-01-22;Albury;19.8;34.6;0 -784;2011-01-23;Albury;20.7;31.4;0 -785;2011-01-24;Albury;19.8;30.6;0 -786;2011-01-25;Albury;14.9;32;0 -787;2011-01-26;Albury;21.1;34.4;0 -788;2011-01-27;Albury;14.3;31.6;0 -789;2011-01-28;Albury;12.6;32.3;0 -790;2011-01-29;Albury;14.5;32;0 -791;2011-01-30;Albury;16.7;35.4;0 -792;2011-01-31;Albury;19.9;38.2;0 -793;2011-02-01;Albury;20.5;39.8;0 -794;2011-02-02;Albury;21.9;33.7;0 -795;2011-02-03;Albury;21.9;36;3.4 -796;2011-02-04;Albury;22.5;28.2;2.6 -797;2011-02-05;Albury;20.4;23;99.2 -798;2011-02-06;Albury;14.7;21.5;51 -799;2011-02-07;Albury;10.8;25.5;0 -800;2011-02-08;Albury;13.4;27.3;0 -801;2011-02-09;Albury;15;29.4;0 -802;2011-02-10;Albury;17;29.7;0 -803;2011-02-11;Albury;19.8;24.8;39.8 -804;2011-02-12;Albury;18.7;28.5;28.2 -805;2011-02-13;Albury;15.1;28.6;0 -806;2011-02-14;Albury;14.5;29.2;0 -807;2011-02-15;Albury;16.4;28;0 -808;2011-02-16;Albury;18.9;22;0.2 -809;2011-02-17;Albury;18.9;29.2;5.8 -810;2011-02-18;Albury;19.3;30.7;0 -811;2011-02-19;Albury;21.7;29;12.2 -812;2011-02-20;Albury;16.7;25.7;12.8 -813;2011-02-21;Albury;10.1;22.5;0 -814;2011-02-22;Albury;12.3;25.2;0 -815;2011-02-23;Albury;12.6;28;0.2 -816;2011-02-24;Albury;13.9;29.2;0 -817;2011-02-25;Albury;16.5;29.8;0 -818;2011-02-26;Albury;15.6;30.9;0 -819;2011-02-27;Albury;19.6;24.8;0.2 -820;2011-02-28;Albury;17.9;30;11.8 -821;2011-03-01;Albury;16;22.8;0 -822;2011-03-02;Albury;8.8;23.4;0 -823;2011-03-03;Albury;8.4;22.3;0 -824;2011-03-04;Albury;8.6;22.1;0 -825;2011-03-05;Albury;11.5;25;0 -826;2011-03-06;Albury;9.6;25.3;0 -827;2011-03-07;Albury;10.6;26.6;0 -828;2011-03-08;Albury;11.4;28.7;0 -829;2011-03-09;Albury;16.8;27;0 -830;2011-03-10;Albury;18.7;20.8;13.4 -831;2011-03-11;Albury;16.8;27;10.2 -832;2011-03-12;Albury;17.2;28.2;0.6 -833;2011-03-13;Albury;19.6;29.3;0.6 -834;2011-03-14;Albury;18.2;26.9;19.8 -835;2011-03-15;Albury;16.3;28.4;0.2 -836;2011-03-16;Albury;17.1;28.2;0.4 -837;2011-03-17;Albury;12.1;25.9;0.2 -838;2011-03-18;Albury;12.8;26.3;0 -839;2011-03-19;Albury;13.3;27.4;0 -840;2011-03-20;Albury;13.9;28.1;0 -841;2011-03-21;Albury;18.2;25.9;0 -842;2011-03-22;Albury;18.6;26.8;0 -843;2011-03-23;Albury;16.3;20.1;0 -844;2011-03-24;Albury;13.9;22;8 -845;2011-03-25;Albury;13.3;22.1;0 -846;2011-03-26;Albury;9.6;24.2;0 -847;2011-03-27;Albury;9.8;23;0 -848;2011-03-28;Albury;10.2;24.7;0 -849;2011-03-29;Albury;11.5;25.7;0 -850;2011-03-30;Albury;12.3;25.8;0 -851;2011-03-31;Albury;7.2;22.1;0.2 -852;2011-05-01;Albury;8.7;20.4;0 -853;2011-05-02;Albury;12.3;22.3;0 -854;2011-05-03;Albury;9;21.9;0 -855;2011-05-04;Albury;6.7;19;0.6 -856;2011-05-05;Albury;4.4;18.1;0.2 -857;2011-05-06;Albury;2.8;16.8;0 -858;2011-05-07;Albury;3.4;15.9;0 -859;2011-05-08;Albury;2.1;16.8;0 -860;2011-05-09;Albury;3.8;16.1;0 -861;2011-05-10;Albury;1.1;15.2;0 -862;2011-05-11;Albury;3;11;3.6 -863;2011-05-12;Albury;0.2;10.1;0.4 -864;2011-05-13;Albury;3.8;14.1;5 -865;2011-05-14;Albury;3.8;14.3;1.8 -866;2011-05-15;Albury;-0.7;13.7;0 -867;2011-05-16;Albury;0.8;11.2;0 -868;2011-05-17;Albury;0.5;15.8;0 -869;2011-05-18;Albury;2.3;17.9;0 -870;2011-05-19;Albury;2.7;16;0 -871;2011-05-20;Albury;4.5;18.6;0 -872;2011-05-21;Albury;3.3;20.5;0 -873;2011-05-22;Albury;5.8;22;0 -874;2011-05-23;Albury;10.2;15;17.4 -875;2011-05-24;Albury;8.9;15.6;3.6 -876;2011-05-25;Albury;3.1;14.7;0 -877;2011-05-26;Albury;1.3;14.9;0 -878;2011-05-27;Albury;1.9;13.8;0 -879;2011-05-28;Albury;2.6;13.9;0 -880;2011-05-29;Albury;2.5;14.8;0 -881;2011-05-30;Albury;3.6;15.9;0 -882;2011-05-31;Albury;2.8;19.4;0 -883;2011-06-01;Albury;3.1;19.8;0 -884;2011-06-02;Albury;2.9;17.6;0 -885;2011-06-03;Albury;4.3;18.3;0 -886;2011-06-04;Albury;8.5;14.8;8.8 -887;2011-06-05;Albury;2.2;12;0 -888;2011-06-06;Albury;4.9;12.8;2 -889;2011-06-07;Albury;-0.5;9.8;0 -890;2011-06-08;Albury;1.5;10.2;2.6 -891;2011-06-09;Albury;2.9;14.6;0 -892;2011-06-10;Albury;-1.1;14;0 -893;2011-06-11;Albury;-1.4;13.9;0 -894;2011-06-12;Albury;1;16.1;0.2 -895;2011-06-13;Albury;-0.3;15.9;0 -896;2011-06-14;Albury;1.7;16.7;0 -897;2011-06-15;Albury;0.5;16.9;0 -898;2011-06-16;Albury;1;16.1;0 -899;2011-06-17;Albury;3;12.6;1 -900;2011-06-18;Albury;5.7;12.5;0.2 -901;2011-06-19;Albury;3.3;11.8;0 -902;2011-06-20;Albury;7.6;14.6;3.6 -903;2011-06-21;Albury;6.6;11.6;10.6 -904;2011-06-22;Albury;5.9;11.1;0.6 -905;2011-06-23;Albury;6.2;14.2;3.4 -906;2011-06-24;Albury;2.9;13.1;0 -907;2011-06-25;Albury;5.5;15.5;0.4 -908;2011-06-26;Albury;3.2;15.7;0 -909;2011-06-27;Albury;0.9;16.4;0 -910;2011-06-28;Albury;-0.2;15.2;0 -911;2011-06-29;Albury;0.9;16.6;0 -912;2011-06-30;Albury;0.3;15.2;0 -913;2011-07-01;Albury;0.3;14.1;0 -914;2011-07-02;Albury;0.2;15.2;0 -915;2011-07-03;Albury;2.9;14.8;0 -916;2011-07-04;Albury;6.3;14.8;15.4 -917;2011-07-05;Albury;6.9;11.2;3.8 -918;2011-07-06;Albury;7;10.8;1.2 -919;2011-07-07;Albury;6.8;11.2;4.4 -920;2011-07-08;Albury;-0.5;8.3;0 -921;2011-07-09;Albury;4.3;9.2;4.2 -922;2011-07-10;Albury;6.4;11;0 -923;2011-07-11;Albury;4.7;11.8;6.6 -924;2011-07-12;Albury;5.7;10.5;0 -925;2011-07-13;Albury;7.1;9.8;0 -926;2011-07-14;Albury;-0.3;12.6;4 -927;2011-07-15;Albury;-1.6;12.1;0 -928;2011-07-16;Albury;0.2;14.1;0 -929;2011-07-17;Albury;5.3;11.1;0 -930;2011-07-18;Albury;8.4;11;8.8 -931;2011-07-19;Albury;0.4;14.5;1.8 -932;2011-07-20;Albury;0.3;16.7;0.2 -933;2011-07-21;Albury;3.5;17.2;0 -934;2011-07-22;Albury;6.9;15.6;0 -935;2011-07-23;Albury;0.1;14.6;0 -936;2011-07-24;Albury;1.6;9.3;0.2 -937;2011-07-25;Albury;5.5;13.2;16.2 -938;2011-07-26;Albury;4.1;14.1;2.2 -939;2011-07-27;Albury;0.5;14.5;0 -940;2011-07-28;Albury;0.2;13.1;0 -941;2011-07-29;Albury;-1.4;14.7;0 -942;2011-07-30;Albury;0.6;16.1;0.2 -943;2011-07-31;Albury;4.9;14.7;1 -944;2011-08-01;Albury;3.4;19;0 -945;2011-08-02;Albury;6.5;20.6;0 -946;2011-08-03;Albury;3.9;21.5;0.2 -947;2011-08-04;Albury;7.1;22.9;0 -948;2011-08-05;Albury;5.6;20.7;0 -949;2011-08-06;Albury;9.9;12.9;14.6 -950;2011-08-07;Albury;5.3;11.1;4.2 -951;2011-08-08;Albury;7.1;12.3;8.2 -952;2011-08-09;Albury;3.1;10.1;1.2 -953;2011-08-10;Albury;6.3;10.9;3.6 -954;2011-08-11;Albury;3.4;16.8;2.8 -955;2011-08-12;Albury;1.6;16.3;0 -956;2011-08-13;Albury;0.7;13.4;0 -957;2011-08-14;Albury;4.3;17.3;0 -958;2011-08-15;Albury;3.9;13.8;1.2 -959;2011-08-16;Albury;9;19.4;0.2 -960;2011-08-17;Albury;7.1;12.6;5.6 -961;2011-08-18;Albury;7.4;10.8;30.8 -962;2011-08-19;Albury;6.9;19.3;0.8 -963;2011-08-20;Albury;3.2;17.3;0 -964;2011-08-21;Albury;2.1;18;0 -965;2011-08-22;Albury;1.8;17.7;0 -966;2011-08-23;Albury;2.5;16.9;0 -967;2011-08-24;Albury;2.4;17.5;0 -968;2011-08-25;Albury;2.5;20.7;0 -969;2011-08-26;Albury;1.9;16.6;0 -970;2011-08-27;Albury;0.8;16.8;0 -971;2011-08-28;Albury;0.4;16.2;0 -972;2011-08-29;Albury;1.4;15.9;0 -973;2011-08-30;Albury;0.6;15.7;0 -974;2011-08-31;Albury;0.4;15.8;0 -975;2011-09-01;Albury;2.6;18.3;0 -976;2011-09-02;Albury;2.8;20.4;0 -977;2011-09-03;Albury;2.6;19.6;0 -978;2011-09-04;Albury;6.5;16.8;0 -979;2011-09-05;Albury;4.8;21.4;3.2 -980;2011-09-06;Albury;10.8;18.8;5 -981;2011-09-07;Albury;-0.1;14.4;1 -982;2011-09-08;Albury;0.4;15.9;0 -983;2011-09-09;Albury;2.7;14;0 -984;2011-09-10;Albury;4;NA;0.2 -985;2011-09-11;Albury;NA;NA;NA -986;2011-09-12;Albury;NA;NA;NA -987;2011-09-13;Albury;NA;15.8;NA -988;2011-09-14;Albury;0.9;20.8;NA -989;2011-09-15;Albury;1.7;17.2;0 -990;2011-09-16;Albury;4.4;20.8;0 -991;2011-09-17;Albury;3.7;21.7;0 -992;2011-09-18;Albury;5.5;23.9;0 -993;2011-09-19;Albury;5.3;26.7;0 -994;2011-09-20;Albury;10.1;13.6;1 -995;2011-09-21;Albury;1.7;18.2;3.6 -996;2011-09-22;Albury;4.4;22.1;0 -997;2011-09-23;Albury;10;18.4;0 -998;2011-09-24;Albury;1.9;18.3;0 -999;2011-09-25;Albury;8.6;19.8;1 -1000;2011-09-26;Albury;3.1;19.6;0 \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/doi_ec.json b/dbrepo-identifier-service/rest-service/src/test/resources/doi_ec.json deleted file mode 100644 index 442aae9772..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/doi_ec.json +++ /dev/null @@ -1,467 +0,0 @@ -{ - "country": { - "resource": "http://sws.geonames.org/6695072/" - }, - "address": { - "postalAddress": { - "addressCountry": "eue" - } - }, - "inScheme": { - "resource": "http://data.crossref.org/fundingdata/vocabulary" - }, - "created": "2011-06-08T16:00:03.0", - "prefLabel": { - "Label": { - "literalForm": { - "lang": "en", - "content": "European Commission" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-31893" - } - }, - "narrower": [ - { - "resource": "http://dx.doi.org/10.13039/100018708" - }, - { - "resource": "http://dx.doi.org/10.13039/100010661" - }, - { - "resource": "http://dx.doi.org/10.13039/100011102" - }, - { - "resource": "http://dx.doi.org/10.13039/100011103" - }, - { - "resource": "http://dx.doi.org/10.13039/100011104" - }, - { - "resource": "http://dx.doi.org/10.13039/100011105" - }, - { - "resource": "http://dx.doi.org/10.13039/100013268" - }, - { - "resource": "http://dx.doi.org/10.13039/100013284" - }, - { - "resource": "http://dx.doi.org/10.13039/100013286" - }, - { - "resource": "http://dx.doi.org/10.13039/100013971" - }, - { - "resource": "http://dx.doi.org/10.13039/100013972" - }, - { - "resource": "http://dx.doi.org/10.13039/100018693" - }, - { - "resource": "http://dx.doi.org/10.13039/100019763" - }, - { - "resource": "http://dx.doi.org/10.13039/100019764" - }, - { - "resource": "http://dx.doi.org/10.13039/100019765" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000781" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000783" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000785" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000802" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000803" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000804" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000808" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000810" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000811" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000886" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000887" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000888" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000889" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000890" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000891" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000892" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000893" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000894" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000895" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000896" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000897" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000898" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000899" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000900" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000904" - }, - { - "resource": "http://dx.doi.org/10.13039/501100000905" - }, - { - "resource": "http://dx.doi.org/10.13039/501100001942" - }, - { - "resource": "http://dx.doi.org/10.13039/501100002207" - }, - { - "resource": "http://dx.doi.org/10.13039/501100003528" - }, - { - "resource": "http://dx.doi.org/10.13039/501100004963" - }, - { - "resource": "http://dx.doi.org/10.13039/501100004964" - }, - { - "resource": "http://dx.doi.org/10.13039/501100004965" - }, - { - "resource": "http://dx.doi.org/10.13039/501100004966" - }, - { - "resource": "http://dx.doi.org/10.13039/501100007561" - }, - { - "resource": "http://dx.doi.org/10.13039/501100007562" - }, - { - "resource": "http://dx.doi.org/10.13039/501100007565" - }, - { - "resource": "http://dx.doi.org/10.13039/501100007601" - }, - { - "resource": "http://dx.doi.org/10.13039/501100007920" - }, - { - "resource": "http://dx.doi.org/10.13039/501100008530" - }, - { - "resource": "http://dx.doi.org/10.13039/501100010790" - }, - { - "resource": "http://dx.doi.org/10.13039/501100012290" - }, - { - "resource": "http://dx.doi.org/10.13039/501100013212" - }, - { - "resource": "http://dx.doi.org/10.13039/501100013213" - }, - { - "resource": "http://dx.doi.org/10.13039/501100013215" - }, - { - "resource": "http://dx.doi.org/10.13039/501100014585" - }, - { - "resource": "http://dx.doi.org/10.13039/100020311" - }, - { - "resource": "http://dx.doi.org/10.13039/100020631" - }, - { - "resource": "http://dx.doi.org/10.13039/100020632" - }, - { - "resource": "http://dx.doi.org/10.13039/100020633" - }, - { - "resource": "http://dx.doi.org/10.13039/100020634" - } - ], - "modified": "2023-04-07T06:35:55.000000", - "altLabel": [ - { - "Label": { - "literalForm": { - "lang": "en", - "content": "European Union" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-46950" - } - }, - { - "Label": { - "literalForm": { - "lang": "es", - "content": "Comisión Europea" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-11817954" - } - }, - { - "Label": { - "literalForm": { - "lang": "de", - "content": "Europäische Kommission" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-6350205" - } - }, - { - "Label": { - "literalForm": { - "lang": "da", - "content": "EU-Kommissionen" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955712" - } - }, - { - "Label": { - "literalForm": { - "lang": "et", - "content": "Euroopa Komisjoni" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955713" - } - }, - { - "Label": { - "literalForm": { - "lang": "el", - "content": "Ευρωπαϊκής Επιτροπής" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955714" - } - }, - { - "Label": { - "literalForm": { - "lang": "bg", - "content": "Европейската комисия" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955715" - } - }, - { - "Label": { - "literalForm": { - "lang": "cs", - "content": "Evropské komise" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955716" - } - }, - { - "Label": { - "literalForm": { - "lang": "fr", - "content": "Commission européenne" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-3798452" - } - }, - { - "Label": { - "literalForm": { - "lang": "ga", - "content": "Choimisiúin Eorpaigh" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955718" - } - }, - { - "Label": { - "literalForm": { - "lang": "hr", - "content": "Europskoj komisiji" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955722" - } - }, - { - "Label": { - "literalForm": { - "lang": "it", - "content": "Commissione europea" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-4073281" - } - }, - { - "Label": { - "literalForm": { - "lang": "it", - "content": "La Commissione europea" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955729" - } - }, - { - "Label": { - "literalForm": { - "lang": "lv", - "content": "Eiropas Komisiju" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955730" - } - }, - { - "Label": { - "literalForm": { - "lang": "lt", - "content": "Europos Komisijos" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955733" - } - }, - { - "Label": { - "literalForm": { - "lang": "hu", - "content": "Európai Bizottságról" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955734" - } - }, - { - "Label": { - "literalForm": { - "lang": "nl", - "content": "Europese Commissie" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-14932494" - } - }, - { - "Label": { - "literalForm": { - "lang": "pl", - "content": "Komisja Europejska" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955740" - } - }, - { - "Label": { - "literalForm": { - "lang": "pt", - "content": "Comissão Europeia" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955741" - } - }, - { - "Label": { - "literalForm": { - "lang": "ro", - "content": "Comisia Europeană" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955743" - } - }, - { - "Label": { - "literalForm": { - "lang": "sk", - "content": "Európskej komisii" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955745" - } - }, - { - "Label": { - "literalForm": { - "lang": "sl", - "content": "Evropski komisiji" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955746" - } - }, - { - "Label": { - "literalForm": { - "lang": "fi", - "content": "Euroopan komission" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955750" - } - }, - { - "Label": { - "literalForm": { - "lang": "sv", - "content": "Europeiska kommissionen" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-24955751" - } - }, - { - "Label": { - "literalForm": { - "lang": "en", - "content": "EC" - }, - "usageFlag": { - "resource": "http://data.crossref.org/fundingdata/vocabulary/acronym" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-31894" - } - }, - { - "Label": { - "literalForm": { - "lang": "en", - "content": "EU" - }, - "usageFlag": { - "resource": "http://data.crossref.org/fundingdata/vocabulary/acronym" - }, - "about": "http://data.crossref.org/fundingdata/vocabulary/Label-25291959" - } - } - ], - "id": "https://doi.org/10.13039/501100000780", - "region": "Europe", - "fundingBodyType": "gov", - "fundingBodySubType": "National government" -} \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/init/schema.sql b/dbrepo-identifier-service/rest-service/src/test/resources/init/schema.sql deleted file mode 100644 index f8482e47d5..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/init/schema.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE SCHEMA IF NOT EXISTS fda; \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/json/metadata0.json b/dbrepo-identifier-service/rest-service/src/test/resources/json/metadata0.json deleted file mode 100644 index d223099bf3..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/json/metadata0.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "id": 4, - "database": { - "id": 4, - "name": "Weather AT", - "exchange_name": "dbrepo.weather_at", - "internal_name": "weather_at", - "description": "Weather data", - "is_public": true - }, - "type": "database", - "titles": [], - "descriptions": [], - "doi": null, - "publisher": "Swedish Government", - "publication_day": 14, - "publication_month": 7, - "publication_year": 2022, - "licenses": [], - "creators": [], - "created": "2022-01-07T20:45:52.000+00:00", - "last_modified": "2018-11-07T10:59:12.000+00:00" -} \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/json/metadata1.json b/dbrepo-identifier-service/rest-service/src/test/resources/json/metadata1.json deleted file mode 100644 index b39d4b5860..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/json/metadata1.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "id": 1, - "database": { - "id": 1, - "name": "Weather", - "exchange_name": "dbrepo.weather", - "internal_name": "weather", - "description": "Weather in Australia", - "is_public": false - }, - "query_id": 1, - "type": "subset", - "titles": [ - { - "id": 1, - "title": "Austrian weather data", - "language": "en" - }, - { - "id": 2, - "title": "Österreichische Wetterdaten", - "type": "TranslatedTitle", - "language": "de" - } - ], - "descriptions": [ - { - "id": 1, - "description": "Selecting all from the weather Austrian table", - "language": "en" - } - ], - "query": "SELECT `id` FROM `foobar`", - "query_normalized": "SELECT `id` FROM `foobar`", - "doi": null, - "query_hash": "abc", - "execution": "2018-11-07T10:59:12.000+00:00", - "result_hash": "def", - "result_number": 2, - "publisher": "Austrian Government", - "creators": [ - { - "id": 1, - "firstname": "Max", - "lastname": "Mustermann", - "creator_name": "Mustermann, Max", - "name_type": "Personal", - "affiliation": "TU Graz", - "affiliation_identifier": "https://ror.org/04wn28048", - "affiliation_identifier_scheme": "ROR", - "name_identifier": "00000-00000-00000", - "name_identifier_scheme": "ORCID" - } - ], - "licenses": [ - { - "identifier": "MIT", - "uri": "https://opensource.org/license/mit/" - } - ], - "publication_month": 5, - "publication_year": 2022, - "created": "2022-01-07T20:45:52.000+00:00", - "last_modified": "2018-11-07T10:59:12.000+00:00" -} \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/orcid_jdoe.json b/dbrepo-identifier-service/rest-service/src/test/resources/orcid_jdoe.json deleted file mode 100644 index b32646c889..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/orcid_jdoe.json +++ /dev/null @@ -1,1277 +0,0 @@ -{ - "orcid-identifier": { - "uri": "https://orcid.org/0000-0003-4216-302X", - "path": "0000-0003-4216-302X", - "host": "orcid.org" - }, - "preferences": { - "locale": "en" - }, - "history": { - "creation-method": "WEBSITE", - "completion-date": { - "value": 1352727077585 - }, - "submission-date": { - "value": 1352723476658 - }, - "last-modified-date": { - "value": 1687717125186 - }, - "claimed": true, - "source": null, - "deactivation-date": null, - "verified-email": true, - "verified-primary-email": true - }, - "person": { - "last-modified-date": { - "value": 1494016313820 - }, - "name": { - "created-date": { - "value": 1460757617078 - }, - "last-modified-date": { - "value": 1504850007188 - }, - "given-names": { - "value": "John" - }, - "family-name": { - "value": "Doe" - }, - "credit-name": null, - "source": null, - "visibility": "public", - "path": "0000-0003-4216-302X" - }, - "other-names": { - "last-modified-date": { - "value": 1462157547720 - }, - "other-name": [ - { - "created-date": { - "value": 1462157351411 - }, - "last-modified-date": { - "value": 1462157547720 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "content": "Josiah Stinkney Carberry", - "visibility": "public", - "path": "/0000-0002-1825-0097/other-names/732317", - "put-code": 732317, - "display-index": 3 - }, - { - "created-date": { - "value": 1446663146889 - }, - "last-modified-date": { - "value": 1462157547720 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "content": "J. Carberry", - "visibility": "public", - "path": "/0000-0002-1825-0097/other-names/565981", - "put-code": 565981, - "display-index": 2 - }, - { - "created-date": { - "value": 1462157351418 - }, - "last-modified-date": { - "value": 1462157547720 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "content": "J. S. Carberry", - "visibility": "public", - "path": "/0000-0002-1825-0097/other-names/732318", - "put-code": 732318, - "display-index": 1 - } - ], - "path": "/0000-0002-1825-0097/other-names" - }, - "biography": { - "created-date": { - "value": 1460757617080 - }, - "last-modified-date": { - "value": 1460757617080 - }, - "content": "Josiah Carberry is a fictitious person. This account is used as a demonstration account by ORCID, CrossRef and others who wish to demonstrate the interaction of ORCID with other scholarly communication systems without having to use a real-person's account.\r\n\r\nJosiah Stinkney Carberry is a fictional professor, created as a joke in 1929. He is said to still teach at Brown University, and to be known for his work in \"psychoceramics\", the supposed study of \"cracked pots\". See his Wikipedia entry for more details.", - "visibility": "public", - "path": "/0000-0002-1825-0097/biography" - }, - "researcher-urls": { - "last-modified-date": { - "value": 1462157645967 - }, - "researcher-url": [ - { - "created-date": { - "value": 1446663146890 - }, - "last-modified-date": { - "value": 1462157645967 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "url-name": "Brown University Page", - "url": { - "value": "http://library.brown.edu/about/hay/carberry.php" - }, - "visibility": "public", - "path": "/0000-0002-1825-0097/researcher-urls/568395", - "put-code": 568395, - "display-index": 2 - }, - { - "created-date": { - "value": 1446663146889 - }, - "last-modified-date": { - "value": 1462157645967 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "url-name": "Wikipedia Entry", - "url": { - "value": "http://en.wikipedia.org/wiki/Josiah_Carberry" - }, - "visibility": "public", - "path": "/0000-0002-1825-0097/researcher-urls/568394", - "put-code": 568394, - "display-index": 1 - } - ], - "path": "/0000-0002-1825-0097/researcher-urls" - }, - "emails": { - "last-modified-date": null, - "email": [], - "path": "/0000-0002-1825-0097/email" - }, - "addresses": { - "last-modified-date": null, - "address": [], - "path": "/0000-0002-1825-0097/address" - }, - "keywords": { - "last-modified-date": { - "value": 1462157635636 - }, - "keyword": [ - { - "created-date": { - "value": 1462157617244 - }, - "last-modified-date": { - "value": 1462157635636 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "content": "psychoceramics", - "visibility": "public", - "path": "/0000-0002-1825-0097/keywords/434187", - "put-code": 434187, - "display-index": 3 - }, - { - "created-date": { - "value": 1462157414545 - }, - "last-modified-date": { - "value": 1462157635636 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "content": "ionian philology", - "visibility": "public", - "path": "/0000-0002-1825-0097/keywords/434184", - "put-code": 434184, - "display-index": 2 - } - ], - "path": "/0000-0002-1825-0097/keywords" - }, - "external-identifiers": { - "last-modified-date": { - "value": 1494016313820 - }, - "external-identifier": [ - { - "created-date": { - "value": 1494016313820 - }, - "last-modified-date": { - "value": 1494016313820 - }, - "source": { - "source-orcid": null, - "source-client-id": { - "uri": "https://orcid.org/client/0000-0002-5982-8983", - "path": "0000-0002-5982-8983", - "host": "orcid.org" - }, - "source-name": { - "value": "Scopus - Elsevier" - }, - "assertion-origin-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "assertion-origin-client-id": null, - "assertion-origin-name": { - "value": "Josiah Carberry" - } - }, - "external-id-type": "Scopus Author ID", - "external-id-value": "7007156898", - "external-id-url": { - "value": "http://www.scopus.com/inward/authorDetails.url?authorID=7007156898&partnerID=MN8TOARS" - }, - "external-id-relationship": "self", - "visibility": "public", - "path": "/0000-0002-1825-0097/external-identifiers/698979", - "put-code": 698979, - "display-index": 0 - } - ], - "path": "/0000-0002-1825-0097/external-identifiers" - }, - "path": "/0000-0002-1825-0097/person" - }, - "activities-summary": { - "last-modified-date": { - "value": 1653413908337 - }, - "distinctions": { - "last-modified-date": null, - "affiliation-group": [], - "path": "/0000-0002-1825-0097/distinctions" - }, - "educations": { - "last-modified-date": null, - "affiliation-group": [], - "path": "/0000-0002-1825-0097/educations" - }, - "employments": { - "last-modified-date": { - "value": 1405895110316 - }, - "affiliation-group": [ - { - "last-modified-date": { - "value": 1405895110316 - }, - "external-ids": { - "external-id": [] - }, - "summaries": [ - { - "employment-summary": { - "created-date": { - "value": 1386356790112 - }, - "last-modified-date": { - "value": 1405895110316 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "put-code": 4288, - "department-name": "Psychoceramics", - "role-title": "Professor", - "start-date": { - "year": { - "value": "1930" - }, - "month": { - "value": "02" - }, - "day": { - "value": "29" - } - }, - "end-date": null, - "organization": { - "name": "Wesleyan University", - "address": { - "city": "Middletown", - "region": "CT", - "country": "US" - }, - "disambiguated-organization": { - "disambiguated-organization-identifier": "5468", - "disambiguation-source": "RINGGOLD" - } - }, - "url": null, - "external-ids": null, - "display-index": "0", - "visibility": "public", - "path": "/0000-0002-1825-0097/employment/4288" - } - } - ] - }, - { - "last-modified-date": { - "value": 1405895110316 - }, - "external-ids": { - "external-id": [] - }, - "summaries": [ - { - "employment-summary": { - "created-date": { - "value": 1386356645400 - }, - "last-modified-date": { - "value": 1405895110316 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "put-code": 4278, - "department-name": "Psychoceramics", - "role-title": "Professor", - "start-date": { - "year": { - "value": "1929" - }, - "month": { - "value": "02" - }, - "day": { - "value": "29" - } - }, - "end-date": null, - "organization": { - "name": "Brown University", - "address": { - "city": "Providence", - "region": "RI", - "country": "US" - }, - "disambiguated-organization": { - "disambiguated-organization-identifier": "6752", - "disambiguation-source": "RINGGOLD" - } - }, - "url": null, - "external-ids": null, - "display-index": "0", - "visibility": "public", - "path": "/0000-0002-1825-0097/employment/4278" - } - } - ] - } - ], - "path": "/0000-0002-1825-0097/employments" - }, - "fundings": { - "last-modified-date": null, - "group": [], - "path": "/0000-0002-1825-0097/fundings" - }, - "invited-positions": { - "last-modified-date": null, - "affiliation-group": [], - "path": "/0000-0002-1825-0097/invited-positions" - }, - "memberships": { - "last-modified-date": null, - "affiliation-group": [], - "path": "/0000-0002-1825-0097/memberships" - }, - "peer-reviews": { - "last-modified-date": { - "value": 1457039326294 - }, - "group": [ - { - "last-modified-date": { - "value": 1457039326294 - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "peer-review", - "external-id-value": "issn:1234-5678", - "external-id-normalized": null, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": null - } - ] - }, - "peer-review-group": [ - { - "last-modified-date": { - "value": 1457039326294 - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "source-work-id", - "external-id-value": "12345678", - "external-id-normalized": { - "value": "12345678", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "peer-review-summary": [ - { - "created-date": { - "value": 1443402117509 - }, - "last-modified-date": { - "value": 1457039326294 - }, - "source": { - "source-orcid": null, - "source-client-id": { - "uri": "https://orcid.org/client/0000-0001-8203-3567", - "path": "0000-0001-8203-3567", - "host": "orcid.org" - }, - "source-name": { - "value": "ORCID" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "reviewer-role": "reviewer", - "external-ids": { - "external-id": [ - { - "external-id-type": "source-work-id", - "external-id-value": "12345678", - "external-id-normalized": { - "value": "12345678", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "review-url": null, - "review-type": "review", - "completion-date": { - "year": { - "value": "2004" - }, - "month": { - "value": "02" - }, - "day": { - "value": "02" - } - }, - "review-group-id": "issn:1234-5678", - "convening-organization": { - "name": "The Psychoceramics Society", - "address": { - "city": "London", - "region": null, - "country": "GB" - }, - "disambiguated-organization": null - }, - "visibility": "public", - "put-code": 1005, - "path": "/0000-0002-1825-0097/peer-review/1005", - "display-index": "0" - } - ] - } - ] - } - ], - "path": "/0000-0002-1825-0097/peer-reviews" - }, - "qualifications": { - "last-modified-date": null, - "affiliation-group": [], - "path": "/0000-0002-1825-0097/qualifications" - }, - "research-resources": { - "last-modified-date": null, - "group": [], - "path": "/0000-0002-1825-0097/research-resources" - }, - "services": { - "last-modified-date": null, - "affiliation-group": [], - "path": "/0000-0002-1825-0097/services" - }, - "works": { - "last-modified-date": { - "value": 1653413908337 - }, - "group": [ - { - "last-modified-date": { - "value": 1494016313835 - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "doi", - "external-id-value": "10.5555/12345680", - "external-id-normalized": { - "value": "10.5555/12345680", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "work-summary": [ - { - "put-code": 9543020, - "created-date": { - "value": 1375526492206 - }, - "last-modified-date": { - "value": 1494016313835 - }, - "source": { - "source-orcid": null, - "source-client-id": { - "uri": "https://orcid.org/client/0000-0002-3054-1567", - "path": "0000-0002-3054-1567", - "host": "orcid.org" - }, - "source-name": { - "value": "Crossref Metadata Search" - }, - "assertion-origin-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "assertion-origin-client-id": null, - "assertion-origin-name": { - "value": "Josiah Carberry" - } - }, - "title": { - "title": { - "value": "A Methodology for the Emulation of Architecture" - }, - "subtitle": null, - "translated-title": null - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "issn", - "external-id-value": "0264-3561", - "external-id-normalized": { - "value": "0264-3561", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "part-of" - }, - { - "external-id-type": "doi", - "external-id-value": "10.5555/12345680", - "external-id-normalized": { - "value": "10.5555/12345680", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "url": null, - "type": "journal-article", - "publication-date": { - "year": { - "value": "2012" - }, - "month": null, - "day": null - }, - "journal-title": null, - "visibility": "public", - "path": "/0000-0002-1825-0097/work/9543020", - "display-index": "2" - }, - { - "put-code": 18777963, - "created-date": { - "value": 1375497097656 - }, - "last-modified-date": { - "value": 1494016313835 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "title": { - "title": { - "value": "A Methodology for the Emulation of Architecture" - }, - "subtitle": null, - "translated-title": null - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "doi", - "external-id-value": "10.5555/12345680", - "external-id-normalized": { - "value": "10.5555/12345680", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "url": null, - "type": "journal-article", - "publication-date": { - "year": { - "value": "2012" - }, - "month": null, - "day": null - }, - "journal-title": null, - "visibility": "public", - "path": "/0000-0002-1825-0097/work/18777963", - "display-index": "1" - } - ] - }, - { - "last-modified-date": { - "value": 1494016313836 - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "doi", - "external-id-value": "10.5555/666655554444", - "external-id-normalized": { - "value": "10.5555/666655554444", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "work-summary": [ - { - "put-code": 4562455, - "created-date": { - "value": 1361131256556 - }, - "last-modified-date": { - "value": 1494016313836 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "title": { - "title": { - "value": "The Memory Bus Considered Harmful" - }, - "subtitle": null, - "translated-title": null - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "issn", - "external-id-value": "0264-3561", - "external-id-normalized": { - "value": "0264-3561", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "part-of" - }, - { - "external-id-type": "doi", - "external-id-value": "10.5555/666655554444", - "external-id-normalized": { - "value": "10.5555/666655554444", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "url": null, - "type": "journal-article", - "publication-date": { - "year": { - "value": "2012" - }, - "month": null, - "day": null - }, - "journal-title": null, - "visibility": "public", - "path": "/0000-0002-1825-0097/work/4562455", - "display-index": "0" - } - ] - }, - { - "last-modified-date": { - "value": 1494016313836 - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "doi", - "external-id-value": "10.5555/987654321", - "external-id-normalized": { - "value": "10.5555/987654321", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "work-summary": [ - { - "put-code": 4562454, - "created-date": { - "value": 1361131256545 - }, - "last-modified-date": { - "value": 1494016313836 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "title": { - "title": { - "value": "The Impact of Interactive Epistemologies on Cryptography" - }, - "subtitle": null, - "translated-title": null - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "issn", - "external-id-value": "0264-3561", - "external-id-normalized": { - "value": "0264-3561", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "part-of" - }, - { - "external-id-type": "doi", - "external-id-value": "10.5555/987654321", - "external-id-normalized": { - "value": "10.5555/987654321", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "url": null, - "type": "journal-article", - "publication-date": { - "year": { - "value": "2011" - }, - "month": null, - "day": null - }, - "journal-title": null, - "visibility": "public", - "path": "/0000-0002-1825-0097/work/4562454", - "display-index": "0" - } - ] - }, - { - "last-modified-date": { - "value": 1494016313836 - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "doi", - "external-id-value": "10.5555/12345679", - "external-id-normalized": { - "value": "10.5555/12345679", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "work-summary": [ - { - "put-code": 4562453, - "created-date": { - "value": 1361131256538 - }, - "last-modified-date": { - "value": 1494016313836 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "title": { - "title": { - "value": "Developing Thin Clients Using Amphibious Epistemologies" - }, - "subtitle": null, - "translated-title": null - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "issn", - "external-id-value": "0264-3561", - "external-id-normalized": { - "value": "0264-3561", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "part-of" - }, - { - "external-id-type": "doi", - "external-id-value": "10.5555/12345679", - "external-id-normalized": { - "value": "10.5555/12345679", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "url": null, - "type": "journal-article", - "publication-date": { - "year": { - "value": "2008" - }, - "month": null, - "day": null - }, - "journal-title": null, - "visibility": "public", - "path": "/0000-0002-1825-0097/work/4562453", - "display-index": "0" - } - ] - }, - { - "last-modified-date": { - "value": 1494016313835 - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "doi", - "external-id-value": "10.5555/12345678", - "external-id-normalized": { - "value": "10.5555/12345678", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "work-summary": [ - { - "put-code": 4562456, - "created-date": { - "value": 1361131256560 - }, - "last-modified-date": { - "value": 1494016313835 - }, - "source": { - "source-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "source-client-id": null, - "source-name": { - "value": "Josiah Carberry" - }, - "assertion-origin-orcid": null, - "assertion-origin-client-id": null, - "assertion-origin-name": null - }, - "title": { - "title": { - "value": "Toward a Unified Theory of High-Energy Metaphysics: Silly String Theory" - }, - "subtitle": null, - "translated-title": null - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "issn", - "external-id-value": "0264-3561", - "external-id-normalized": { - "value": "0264-3561", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "part-of" - }, - { - "external-id-type": "doi", - "external-id-value": "10.5555/12345678", - "external-id-normalized": { - "value": "10.5555/12345678", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "url": null, - "type": "journal-article", - "publication-date": { - "year": { - "value": "2008" - }, - "month": null, - "day": null - }, - "journal-title": null, - "visibility": "public", - "path": "/0000-0002-1825-0097/work/4562456", - "display-index": "0" - } - ] - }, - { - "last-modified-date": { - "value": 1653413908337 - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "doi", - "external-id-value": "10.1109/TPS.1987.4316723", - "external-id-normalized": { - "value": "10.1109/tps.1987.4316723", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - }, - { - "external-id-type": "eid", - "external-id-value": "2-s2.0-0023398608", - "external-id-normalized": { - "value": "2-s2.0-0023398608", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "work-summary": [ - { - "put-code": 19980729, - "created-date": { - "value": 1446663146999 - }, - "last-modified-date": { - "value": 1653413908337 - }, - "source": { - "source-orcid": null, - "source-client-id": { - "uri": "https://orcid.org/client/0000-0002-5982-8983", - "path": "0000-0002-5982-8983", - "host": "orcid.org" - }, - "source-name": { - "value": "Scopus - Elsevier" - }, - "assertion-origin-orcid": { - "uri": "https://orcid.org/0000-0002-1825-0097", - "path": "0000-0002-1825-0097", - "host": "orcid.org" - }, - "assertion-origin-client-id": null, - "assertion-origin-name": { - "value": "Josiah Carberry" - } - }, - "title": { - "title": { - "value": "Bulk and surface plasmons in artificially structured materials" - }, - "subtitle": null, - "translated-title": null - }, - "external-ids": { - "external-id": [ - { - "external-id-type": "doi", - "external-id-value": "10.1109/TPS.1987.4316723", - "external-id-normalized": { - "value": "10.1109/tps.1987.4316723", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - }, - { - "external-id-type": "eid", - "external-id-value": "2-s2.0-0023398608", - "external-id-normalized": { - "value": "2-s2.0-0023398608", - "transient": true - }, - "external-id-normalized-error": null, - "external-id-url": null, - "external-id-relationship": "self" - } - ] - }, - "url": { - "value": "http://www.scopus.com/inward/record.url?eid=2-s2.0-0023398608&partnerID=MN8TOARS" - }, - "type": "journal-article", - "publication-date": { - "year": { - "value": "1987" - }, - "month": null, - "day": null - }, - "journal-title": { - "value": "IEEE Transactions on Plasma Science" - }, - "visibility": "public", - "path": "/0000-0002-1825-0097/work/19980729", - "display-index": "0" - } - ] - } - ], - "path": "/0000-0002-1825-0097/works" - }, - "path": "/0000-0002-1825-0097/activities" - }, - "path": "/0000-0002-1825-0097" -} \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/ror_tuw.json b/dbrepo-identifier-service/rest-service/src/test/resources/ror_tuw.json deleted file mode 100644 index e14aa6610e..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/ror_tuw.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "id": "https://ror.org/04d836q62", - "name": "TU Wien", - "email_address": "", - "ip_addresses": [], - "established": 1815, - "types": [ - "Education" - ], - "relationships": [ - { - "label": "Complexity Science Hub Vienna", - "type": "Related", - "id": "https://ror.org/023dz9m50" - }, - { - "label": "Christian Doppler Laboratory for Thermoelectricity", - "type": "Child", - "id": "https://ror.org/01cbw5x35" - }, - { - "label": "Vienna Center for Quantum Science and Technology", - "type": "Child", - "id": "https://ror.org/014cpn338" - } - ], - "addresses": [ - { - "lat": 48.20849, - "lng": 16.37208, - "state": null, - "state_code": null, - "city": "Vienna", - "geonames_city": { - "id": 2761369, - "city": "Vienna", - "geonames_admin1": { - "name": "Vienna", - "id": 2761367, - "ascii_name": "Vienna", - "code": "AT.09" - }, - "geonames_admin2": { - "name": "Vienna", - "id": 2761333, - "ascii_name": "Vienna", - "code": "AT.09.900" - }, - "license": { - "attribution": "Data from geonames.org under a CC-BY 3.0 license", - "license": "http://creativecommons.org/licenses/by/3.0/" - }, - "nuts_level1": { - "name": null, - "code": null - }, - "nuts_level2": { - "name": null, - "code": null - }, - "nuts_level3": { - "name": null, - "code": null - } - }, - "postcode": null, - "primary": false, - "line": null, - "country_geonames_id": 2782113 - } - ], - "links": [ - "https://www.tuwien.at" - ], - "aliases": [ - "Technische Universität Wien", - "Vienna University of Technology" - ], - "acronyms": [ - "TUW" - ], - "status": "active", - "wikipedia_url": "https://en.wikipedia.org/wiki/TU_Wien", - "labels": [], - "country": { - "country_name": "Austria", - "country_code": "AT" - }, - "external_ids": { - "ISNI": { - "preferred": "0000 0004 1937 0669", - "all": [ - "0000 0004 1937 0669" - ] - }, - "FundRef": { - "preferred": "501100004729", - "all": [ - "501100004729", - "100007223" - ] - }, - "OrgRef": { - "preferred": null, - "all": [ - "1267354" - ] - }, - "Wikidata": { - "preferred": "Q689400", - "all": [ - "Q689400", - "Q757615" - ] - }, - "GRID": { - "preferred": "grid.5329.d", - "all": "grid.5329.d" - } - } -} \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/xml/datacite-example-dataset-v4.xml b/dbrepo-identifier-service/rest-service/src/test/resources/xml/datacite-example-dataset-v4.xml deleted file mode 100644 index 944d9dbae2..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/xml/datacite-example-dataset-v4.xml +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://datacite.org/schema/kernel-4" xsi:schemaLocation="http://datacite.org/schema/kernel-4 https://schema.datacite.org/meta/kernel-4.4/metadata.xsd"> - <identifier identifierType="DOI">10.5072/D3P26Q35R-Test</identifier> - <creators> - <creator> - <creatorName nameType="Personal">Fosmire, Michael</creatorName> - <givenName>Michael</givenName> - <familyName>Fosmire</familyName> - </creator> - <creator> - <creatorName nameType="Personal">Wertz, Ruth</creatorName> - <givenName>Ruth</givenName> - <familyName>Wertz</familyName> - </creator> - <creator> - <creatorName nameType="Personal">Purzer, Senay</creatorName> - <givenName>Senay</givenName> - <familyName>Purzer</familyName> - </creator> - </creators> - <titles> - <title xml:lang="en">Critical Engineering Literacy Test (CELT)</title> - </titles> - <publisher xml:lang="en">Purdue University Research Repository (PURR)</publisher> - <publicationYear>2013</publicationYear> - <subjects> - <subject xml:lang="en">Assessment</subject> - <subject xml:lang="en">Information Literacy</subject> - <subject xml:lang="en">Engineering</subject> - <subject xml:lang="en">Undergraduate Students</subject> - <subject xml:lang="en">CELT</subject> - <subject xml:lang="en">Purdue University</subject> - </subjects> - <language>en</language> - <resourceType resourceTypeGeneral="Dataset">Dataset</resourceType> - <version>1.0</version> - <descriptions> - <description xml:lang="en" descriptionType="Abstract">We developed an instrument, Critical Engineering Literacy Test (CELT), which is a multiple choice instrument designed to measure undergraduate students’ scientific and information literacy skills. It requires students to first read a technical memo and, based on the memo’s arguments, answer eight multiple choice and six open-ended response questions. We collected data from 143 first-year engineering students and conducted an item analysis. The KR-20 reliability of the instrument was .39. Item difficulties ranged between .17 to .83. The results indicate low reliability index but acceptable levels of item difficulties and item discrimination indices. Students were most challenged when answering items measuring scientific and mathematical literacy (i.e., identifying incorrect information).</description> - </descriptions> -</resource> diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/xml/metadata0.xml b/dbrepo-identifier-service/rest-service/src/test/resources/xml/metadata0.xml deleted file mode 100644 index 1b4e85d368..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/xml/metadata0.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://datacite.org/schema/kernel-4" - xsi:schemaLocation="http://datacite.org/schema/kernel-4 https://schema.datacite.org/meta/kernel-4.4/metadata.xsd"> - <identifier identifierType="PID">http://localhost:3000/pid/1</identifier> - <titles> - <title xml:lang="en">Australia weather data</title> - </titles> - <publisher xml:lang="en">Australian Government</publisher> - <publicationYear>2022</publicationYear> - <dates> - <date dateType="Issued">2022-01-07T20:45:52Z</date> - <date dateType="Available">2022-01-07T20:45:52Z</date> - </dates> - <resourceType resourceTypeGeneral="Dataset">Dataset</resourceType> - <descriptions> - <description descriptionType="Abstract">Selecting all from the weather Australia table</description> - </descriptions> - <version>1.0</version> -</resource> \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/src/test/resources/xml/metadata1.xml b/dbrepo-identifier-service/rest-service/src/test/resources/xml/metadata1.xml deleted file mode 100644 index cb6aaeede1..0000000000 --- a/dbrepo-identifier-service/rest-service/src/test/resources/xml/metadata1.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://datacite.org/schema/kernel-4" - xsi:schemaLocation="http://datacite.org/schema/kernel-4 https://schema.datacite.org/meta/kernel-4.4/metadata.xsd"> - <identifier identifierType="PID">http://localhost:3000/pid/1</identifier> - <creators> - <creator> - <creatorName nameType="Personal">Mustermann, Max</creatorName> - <givenName>Max</givenName> - <familyName>Mustermann</familyName> - <nameIdentifier schemeURI="https://orcid.org" nameIdentifierScheme="ORCID">00000-00000-00000 - </nameIdentifier> - </creator> - </creators> - <titles> - <title xml:lang="en">Australia weather data</title> - </titles> - <publisher xml:lang="en">Australian Government</publisher> - <publicationYear>2022</publicationYear> - <dates> - <date dateType="Issued">2022-01-07T20:45:52Z</date> - <date dateType="Available">2022-01-07T20:45:52Z</date> - </dates> - <resourceType resourceTypeGeneral="Dataset">Dataset</resourceType> - <descriptions> - <description descriptionType="Abstract">Selecting all from the weather Australia table</description> - </descriptions> - <version>1.0</version> -</resource> \ No newline at end of file diff --git a/dbrepo-identifier-service/rest-service/~ b/dbrepo-identifier-service/rest-service/~ deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-identifier-service/services/pom.xml b/dbrepo-identifier-service/services/pom.xml deleted file mode 100644 index d1eae1c8a0..0000000000 --- a/dbrepo-identifier-service/services/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <dependencies> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>api</artifactId> - <version>1.3.0</version> - <scope>compile</scope> - </dependency> - </dependencies> - <parent> - <artifactId>dbrepo-identifier-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.3.0</version> - </parent> - - <artifactId>services</artifactId> - <version>1.3.0</version> - <name>dbrepo-identifier-service-services</name> - - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <configuration> - <source>${java.version}</source> - <target>${java.version}</target> - <annotationProcessorPaths> - <path> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - <version>${lombok.version}</version> - </path> - <!-- keep this order https://stackoverflow.com/questions/47676369/mapstruct-and-lombok-not-working-together#answer-65021876 --> - <path> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct-processor</artifactId> - <version>${mapstruct.version}</version> - </path> - </annotationProcessorPaths> - </configuration> - </plugin> - </plugins> - </build> - -</project> diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/auth/AuthTokenFilter.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/auth/AuthTokenFilter.java deleted file mode 100644 index 92b60f4f8a..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/auth/AuthTokenFilter.java +++ /dev/null @@ -1,100 +0,0 @@ -package at.tuwien.auth; - -import at.tuwien.api.auth.RealmAccessDto; -import at.tuwien.api.user.UserDetailsDto; -import com.auth0.jwt.JWT; -import com.auth0.jwt.JWTVerifier; -import com.auth0.jwt.algorithms.Algorithm; -import com.auth0.jwt.interfaces.DecodedJWT; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.util.StringUtils; -import org.springframework.web.filter.OncePerRequestFilter; - -import java.io.IOException; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.interfaces.RSAPublicKey; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.X509EncodedKeySpec; -import java.util.Arrays; -import java.util.Base64; -import java.util.stream.Collectors; - -@Slf4j -public class AuthTokenFilter extends OncePerRequestFilter { - - @Value("${fda.jwt.issuer}") - private String issuer; - - @Value("${fda.jwt.public_key}") - private String publicKey; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { - final String jwt = parseJwt(request); - if (jwt != null) { - final UserDetails userDetails = verifyJwt(jwt); - log.debug("authenticated user {}", userDetails); - final UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( - userDetails, null, userDetails.getAuthorities()); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - - SecurityContextHolder.getContext().setAuthentication(authentication); - } - filterChain.doFilter(request, response); - } - - public UserDetails verifyJwt(String token) throws ServletException { - final KeyFactory kf; - try { - kf = KeyFactory.getInstance("RSA"); - } catch (NoSuchAlgorithmException e) { - log.error("Failed to find RSA algorithm"); - throw new ServletException("Failed to find RSA algorithm", e); - } - final X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)); - final RSAPublicKey pubKey; - try { - pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509); - } catch (InvalidKeySpecException e) { - log.error("Provided public key is invalid"); - throw new ServletException("Provided public key is invalid", e); - } - final Algorithm algorithm = Algorithm.RSA256(pubKey, null); - JWTVerifier verifier = JWT.require(algorithm) - .withIssuer(issuer) - .withAudience("spring") - .build(); - final DecodedJWT jwt = verifier.verify(token); - final RealmAccessDto realmAccess = jwt.getClaim("realm_access").as(RealmAccessDto.class); - return UserDetailsDto.builder() - .username(jwt.getClaim("client_id").asString()) - .authorities(Arrays.stream(realmAccess.getRoles()).map(SimpleGrantedAuthority::new).collect(Collectors.toList())) - .build(); - } - - /** - * Parses the token from the HTTP header of the request - * - * @param request The request. - * @return The token. - */ - public String parseJwt(HttpServletRequest request) { - String headerAuth = request.getHeader("Authorization"); - if (StringUtils.hasText(headerAuth) && headerAuth.startsWith("Bearer ")) { - return headerAuth.substring(7, headerAuth.length()); - } - return null; - } -} \ No newline at end of file diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/DataCiteConfig.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/DataCiteConfig.java deleted file mode 100644 index ec84c3f4ff..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/DataCiteConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package at.tuwien.config; - -import lombok.Getter; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; - -@Getter -@Profile("doi") -@Configuration -public class DataCiteConfig { - - @Value("${fda.datacite.url}") - private String url; - - @Value("${fda.datacite.prefix}") - private String prefix; - - @Value("${fda.datacite.username}") - private String username; - - @Value("${fda.datacite.password}") - private String password; -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/EndpointConfig.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/EndpointConfig.java deleted file mode 100644 index 88b1a613f8..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/EndpointConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package at.tuwien.config; - -import lombok.Getter; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; - -@Getter -@Configuration -public class EndpointConfig { - - @Value("${fda.website}") - private String websiteUrl; - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/GatewayConfig.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/GatewayConfig.java deleted file mode 100644 index ca023e1ad0..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/GatewayConfig.java +++ /dev/null @@ -1,38 +0,0 @@ -package at.tuwien.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.support.BasicAuthenticationInterceptor; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.DefaultUriBuilderFactory; - -@Configuration -public class GatewayConfig { - - @Value("${fda.gateway.endpoint}") - private String gatewayEndpoint; - - @Value("${spring.rabbitmq.username}") - private String brokerUsername; - - @Value("${spring.rabbitmq.password}") - private String brokerPassword; - - @Bean("restTemplate") - public RestTemplate restTemplate() { - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(gatewayEndpoint)); - return restTemplate; - } - - @Bean("brokerRestTemplate") - public RestTemplate brokerRestTemplate() { - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(gatewayEndpoint)); - restTemplate.getInterceptors() - .add(new BasicAuthenticationInterceptor(brokerUsername, brokerPassword)); - return restTemplate; - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/JacksonConfig.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/JacksonConfig.java deleted file mode 100644 index a5c64eaa04..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/JacksonConfig.java +++ /dev/null @@ -1,32 +0,0 @@ -package at.tuwien.config; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; - -import java.util.Date; -import java.util.TimeZone; - -@Slf4j -@Configuration -public class JacksonConfig { - - @Bean - @Primary - public ObjectMapper objectMapper() throws JsonProcessingException { - final ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.registerModule(new Jdk8Module()); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - objectMapper.setTimeZone(TimeZone.getTimeZone("UTC")); - log.debug("current time is {}", objectMapper.writeValueAsString(new Date())); - return objectMapper; - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/OpenSearchConfig.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/OpenSearchConfig.java deleted file mode 100644 index 48f9f2eeda..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/OpenSearchConfig.java +++ /dev/null @@ -1,61 +0,0 @@ -package at.tuwien.config; - -import lombok.extern.log4j.Log4j2; -import org.apache.http.HttpHost; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.opensearch.client.RestClient; -import org.opensearch.client.RestClientBuilder; -import org.opensearch.client.RestHighLevelClient; -import org.opensearch.client.sniff.NodesSniffer; -import org.opensearch.client.sniff.OpenSearchNodesSniffer; -import org.opensearch.client.sniff.Sniffer; -import org.opensearch.data.client.orhlc.AbstractOpenSearchConfiguration; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.TimeUnit; - -@Log4j2 -@Configuration -public class OpenSearchConfig extends AbstractOpenSearchConfiguration { - - @Value("${spring.opensearch.host}") - private String openSearchHost; - - @Value("${spring.opensearch.port}") - private Integer openSearchPort; - - @Value("${spring.opensearch.protocol}") - private String openSearchProtocol; - - @Value("${spring.opensearch.username}") - private String openSearchUsername; - - @Value("${spring.opensearch.password}") - private String openSearchPassword; - - @Bean - @Override - public RestHighLevelClient opensearchClient() { - log.debug("open search endpoint: {}://{}:{}", openSearchProtocol, openSearchHost, openSearchPort); - final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); - credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(openSearchUsername, openSearchPassword)); - RestClientBuilder builder = RestClient.builder(new HttpHost(openSearchHost, openSearchPort, openSearchProtocol)) - .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)); - return new RestHighLevelClient(builder); - } - - @Bean - public Sniffer nodesSniffer() { - final NodesSniffer nodesSniffer = new OpenSearchNodesSniffer(opensearchClient().getLowLevelClient(), - TimeUnit.SECONDS.toMillis(5), OpenSearchNodesSniffer.Scheme.HTTP); - return Sniffer.builder(opensearchClient().getLowLevelClient()) - .setNodesSniffer(nodesSniffer) - .build(); - - } -} \ No newline at end of file diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/TemplateConfig.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/TemplateConfig.java deleted file mode 100644 index d38f17c6cb..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/TemplateConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package at.tuwien.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.thymeleaf.spring6.SpringTemplateEngine; -import org.thymeleaf.templatemode.TemplateMode; -import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; - -import java.nio.charset.StandardCharsets; - -@Configuration -public class TemplateConfig { - - @Bean - public SpringTemplateEngine springTemplateEngine() { - final SpringTemplateEngine springTemplateEngine = new SpringTemplateEngine(); - springTemplateEngine.addTemplateResolver(oaiTemplateResolver()); - return springTemplateEngine; - } - - private ClassLoaderTemplateResolver oaiTemplateResolver() { - final ClassLoaderTemplateResolver oaiTemplateResolver = new ClassLoaderTemplateResolver(); - oaiTemplateResolver.setPrefix("/templates/"); - oaiTemplateResolver.setSuffix(".xml"); - oaiTemplateResolver.setTemplateMode(TemplateMode.TEXT); - oaiTemplateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name()); - oaiTemplateResolver.setCacheable(false); - return oaiTemplateResolver; - } -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java deleted file mode 100644 index 4169e7977c..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java +++ /dev/null @@ -1,96 +0,0 @@ -package at.tuwien.config; - -import at.tuwien.auth.AuthTokenFilter; -import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; -import io.swagger.v3.oas.annotations.security.SecurityScheme; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import org.springframework.security.web.util.matcher.OrRequestMatcher; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; - -import jakarta.servlet.http.HttpServletResponse; - -@Configuration -@EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true) -@SecurityScheme( - name = "bearerAuth", - type = SecuritySchemeType.HTTP, - bearerFormat = "JWT", - scheme = "bearer" -) -public class WebSecurityConfig { - - @Bean - public AuthTokenFilter authTokenFilter() { - return new AuthTokenFilter(); - } - - @Bean - public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - final OrRequestMatcher internalEndpoints = new OrRequestMatcher( - new AntPathRequestMatcher("/actuator/**", "GET"), - new AntPathRequestMatcher("/v3/api-docs.yaml"), - new AntPathRequestMatcher("/v3/api-docs/**"), - new AntPathRequestMatcher("/swagger-ui/**"), - new AntPathRequestMatcher("/swagger-ui.html") - ); - final OrRequestMatcher publicEndpoints = new OrRequestMatcher( - new AntPathRequestMatcher("/api/identifier/**", "GET"), - new AntPathRequestMatcher("/api/pid/**", "GET") - ); - /* enable CORS and disable CSRF */ - http = http.cors().and().csrf().disable(); - /* set session management to stateless */ - http = http - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and(); - /* set unauthorized requests exception handler */ - http = http - .exceptionHandling() - .authenticationEntryPoint( - (request, response, ex) -> { - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, - ex.getMessage() - ); - } - ).and(); - /* set permissions on endpoints */ - http.authorizeHttpRequests() - /* our internal endpoints */ - .requestMatchers(internalEndpoints).permitAll() - /* our public endpoints */ - .requestMatchers(publicEndpoints).permitAll() - /* our private endpoints */ - .anyRequest().authenticated(); - /* add JWT token filter */ - http.addFilterBefore(authTokenFilter(), - UsernamePasswordAuthenticationFilter.class - ); - return http.build(); - } - - @Bean - public CorsFilter corsFilter() { - final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - final CorsConfiguration config = new CorsConfiguration(); - config.setAllowCredentials(true); - config.addAllowedOriginPattern("*"); - config.addAllowedHeader("*"); - config.addAllowedMethod("*"); - source.registerCorsConfiguration("/**", config); - return new CorsFilter(source); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/AccessDeniedException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/AccessDeniedException.java deleted file mode 100644 index 84169f32e0..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/AccessDeniedException.java +++ /dev/null @@ -1,23 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -import java.io.IOException; - -@ResponseStatus(code = HttpStatus.FORBIDDEN) -public class AccessDeniedException extends IOException { - - public AccessDeniedException(String msg) { - super(msg); - } - - public AccessDeniedException(String msg, Throwable thr) { - super(msg, thr); - } - - public AccessDeniedException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/DatabaseNotFoundException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/DatabaseNotFoundException.java deleted file mode 100644 index 3c22d6ea35..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/DatabaseNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class DatabaseNotFoundException extends Exception { - - public DatabaseNotFoundException(String msg) { - super(msg); - } - - public DatabaseNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public DatabaseNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/DoiNotFoundException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/DoiNotFoundException.java deleted file mode 100644 index 4530e1e996..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/DoiNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class DoiNotFoundException extends Exception { - - public DoiNotFoundException(String msg) { - super(msg); - } - - public DoiNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public DoiNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierAlreadyExistsException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierAlreadyExistsException.java deleted file mode 100644 index e913485aad..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierAlreadyExistsException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.CONFLICT) -public class IdentifierAlreadyExistsException extends Exception { - - public IdentifierAlreadyExistsException(String msg) { - super(msg); - } - - public IdentifierAlreadyExistsException(String msg, Throwable thr) { - super(msg, thr); - } - - public IdentifierAlreadyExistsException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierAlreadyPublishedException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierAlreadyPublishedException.java deleted file mode 100644 index fefe477205..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierAlreadyPublishedException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.PRECONDITION_FAILED) -public class IdentifierAlreadyPublishedException extends Exception { - - public IdentifierAlreadyPublishedException(String msg) { - super(msg); - } - - public IdentifierAlreadyPublishedException(String msg, Throwable thr) { - super(msg, thr); - } - - public IdentifierAlreadyPublishedException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierNotFoundException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierNotFoundException.java deleted file mode 100644 index f0bb71f364..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class IdentifierNotFoundException extends Exception { - - public IdentifierNotFoundException(String msg) { - super(msg); - } - - public IdentifierNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public IdentifierNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierPublishingNotAllowedException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierPublishingNotAllowedException.java deleted file mode 100644 index b2748cb9a7..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierPublishingNotAllowedException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_ACCEPTABLE) -public class IdentifierPublishingNotAllowedException extends Exception { - - public IdentifierPublishingNotAllowedException(String msg) { - super(msg); - } - - public IdentifierPublishingNotAllowedException(String msg, Throwable thr) { - super(msg, thr); - } - - public IdentifierPublishingNotAllowedException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierRequestException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierRequestException.java deleted file mode 100644 index ef20713d6f..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierRequestException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_REQUEST) -public class IdentifierRequestException extends Exception { - - public IdentifierRequestException(String msg) { - super(msg); - } - - public IdentifierRequestException(String msg, Throwable thr) { - super(msg, thr); - } - - public IdentifierRequestException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierUpdateBadFormException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierUpdateBadFormException.java deleted file mode 100644 index 884a5d4bc5..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/IdentifierUpdateBadFormException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_REQUEST) -public class IdentifierUpdateBadFormException extends Exception { - - public IdentifierUpdateBadFormException(String msg) { - super(msg); - } - - public IdentifierUpdateBadFormException(String msg, Throwable thr) { - super(msg, thr); - } - - public IdentifierUpdateBadFormException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/NotAllowedException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/NotAllowedException.java deleted file mode 100644 index 44c3d430f9..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/NotAllowedException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.METHOD_NOT_ALLOWED) -public class NotAllowedException extends Exception { - - public NotAllowedException(String msg) { - super(msg); - } - - public NotAllowedException(String msg, Throwable thr) { - super(msg, thr); - } - - public NotAllowedException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/OrcidNotFoundException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/OrcidNotFoundException.java deleted file mode 100644 index 0f87985305..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/OrcidNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class OrcidNotFoundException extends Exception { - - public OrcidNotFoundException(String msg) { - super(msg); - } - - public OrcidNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public OrcidNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/QueryNotFoundException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/QueryNotFoundException.java deleted file mode 100644 index a5e9075489..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/QueryNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class QueryNotFoundException extends Exception { - - public QueryNotFoundException(String msg) { - super(msg); - } - - public QueryNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public QueryNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/RemoteUnavailableException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/RemoteUnavailableException.java deleted file mode 100644 index 3e18ea33b5..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/RemoteUnavailableException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_GATEWAY) -public class RemoteUnavailableException extends Exception { - - public RemoteUnavailableException(String msg) { - super(msg); - } - - public RemoteUnavailableException(String msg, Throwable thr) { - super(msg, thr); - } - - public RemoteUnavailableException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/RorNotFoundException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/RorNotFoundException.java deleted file mode 100644 index e22cad5c36..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/RorNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class RorNotFoundException extends Exception { - - public RorNotFoundException(String msg) { - super(msg); - } - - public RorNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public RorNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/UserNotFoundException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/UserNotFoundException.java deleted file mode 100644 index 0abb87f609..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/UserNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "User not found") -public class UserNotFoundException extends Exception { - - public UserNotFoundException(String message) { - super(message); - } - - public UserNotFoundException(String message, Throwable thr) { - super(message, thr); - } - - public UserNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/ViewNotFoundException.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/ViewNotFoundException.java deleted file mode 100644 index 2f260975ff..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/exception/ViewNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "View not found") -public class ViewNotFoundException extends Exception { - - public ViewNotFoundException(String message) { - super(message); - } - - public ViewNotFoundException(String message, Throwable thr) { - super(message, thr); - } - - public ViewNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/ApiTemplateInterceptor.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/ApiTemplateInterceptor.java deleted file mode 100644 index 2ffd0f6a0f..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/ApiTemplateInterceptor.java +++ /dev/null @@ -1,7 +0,0 @@ -package at.tuwien.gateway; - -import org.springframework.stereotype.Service; - -@Service -public interface ApiTemplateInterceptor { -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/CrossrefGateway.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/CrossrefGateway.java deleted file mode 100644 index 30bc0dc73d..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/CrossrefGateway.java +++ /dev/null @@ -1,8 +0,0 @@ -package at.tuwien.gateway; - -import at.tuwien.api.crossref.CrossrefDto; -import at.tuwien.exception.DoiNotFoundException; - -public interface CrossrefGateway { - CrossrefDto findById(String id) throws DoiNotFoundException; -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/OrcidGateway.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/OrcidGateway.java deleted file mode 100644 index b949ddbadd..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/OrcidGateway.java +++ /dev/null @@ -1,11 +0,0 @@ -package at.tuwien.gateway; - -import at.tuwien.api.orcid.OrcidDto; -import at.tuwien.exception.OrcidNotFoundException; -import org.springframework.stereotype.Service; - -@Service -public interface OrcidGateway { - - OrcidDto findByUrl(String url) throws OrcidNotFoundException; -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/QueryServiceGateway.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/QueryServiceGateway.java deleted file mode 100644 index aef227e06f..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/QueryServiceGateway.java +++ /dev/null @@ -1,36 +0,0 @@ -package at.tuwien.gateway; - -import at.tuwien.api.database.query.QueryDto; -import at.tuwien.api.identifier.IdentifierSaveDto; -import at.tuwien.exception.QueryNotFoundException; -import at.tuwien.exception.RemoteUnavailableException; -import org.springframework.stereotype.Service; - -@Service -public interface QueryServiceGateway { - - /** - * Finds a query by given id from the query service that internally looks in the query store of a container. - * - * @param databaseId The database id. - * @param identifier The identifier containing the query id and database id. - * @param authorization The authorization token. - * @return The query information if successful. - * @throws QueryNotFoundException The query was not found. - * @throws RemoteUnavailableException The remote service is not available. - */ - QueryDto find(Long databaseId, IdentifierSaveDto identifier, String authorization) - throws QueryNotFoundException, RemoteUnavailableException; - - /** - * Exports a query by given id. - * - * @param databaseId The database id. - * @param queryId The query id. - * @return The exported resource as bytes. - * @throws RemoteUnavailableException The remote service is not available. - * @throws QueryNotFoundException The query was not found. - */ - byte[] export(Long databaseId, Long queryId) throws RemoteUnavailableException, - QueryNotFoundException; -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/RorGateway.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/RorGateway.java deleted file mode 100644 index 29f226efe7..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/RorGateway.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien.gateway; - -import at.tuwien.api.ror.RorDto; -import at.tuwien.exception.RorNotFoundException; - -public interface RorGateway { - - RorDto findById(String id) throws RorNotFoundException; -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/ApiTemplateInterceptorImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/ApiTemplateInterceptorImpl.java deleted file mode 100644 index 27517359c2..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/ApiTemplateInterceptorImpl.java +++ /dev/null @@ -1,22 +0,0 @@ -package at.tuwien.gateway.impl; - -import at.tuwien.gateway.ApiTemplateInterceptor; -import org.springframework.http.HttpRequest; -import org.springframework.http.client.ClientHttpRequestExecution; -import org.springframework.http.client.ClientHttpRequestInterceptor; -import org.springframework.http.client.ClientHttpResponse; -import org.springframework.stereotype.Service; - -import java.io.IOException; - -@Service -public class ApiTemplateInterceptorImpl implements ApiTemplateInterceptor, ClientHttpRequestInterceptor { - - @Override - public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) - throws IOException { - request.getHeaders().set("Content-Type", "application/json"); - request.getHeaders().set("Accept", "application/json"); - return execution.execute(request, body); - } -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/CrossrefGatewayImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/CrossrefGatewayImpl.java deleted file mode 100644 index af3fe58732..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/CrossrefGatewayImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package at.tuwien.gateway.impl; - -import at.tuwien.api.crossref.CrossrefDto; -import at.tuwien.exception.DoiNotFoundException; -import at.tuwien.gateway.CrossrefGateway; -import lombok.extern.log4j.Log4j2; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.client.ResourceAccessException; -import org.springframework.web.client.RestTemplate; - -@Log4j2 -@Service -public class CrossrefGatewayImpl implements CrossrefGateway { - - private final RestTemplate restTemplate; - - public CrossrefGatewayImpl() { - this.restTemplate = new RestTemplate(); - } - - @Override - public CrossrefDto findById(String id) throws DoiNotFoundException { - final HttpHeaders headers = new HttpHeaders(); - headers.set("Accept", "application/json"); - final String url = "http://data.crossref.org/fundingdata/funder/" + id; - final ResponseEntity<CrossrefDto> response; - try { - log.trace("call CrossRef id {}", id); - response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(null, headers), CrossrefDto.class); - } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable e) { - log.error("Failed to retrieve CrossRef metadata from URL {}: {}", url, e.getMessage()); - throw new DoiNotFoundException("Failed to retrieve CrossRef metadata from URL " + url + ": " + e.getMessage()); - } - return response.getBody(); - } -} \ No newline at end of file diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/OrcidGatewayImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/OrcidGatewayImpl.java deleted file mode 100644 index 8e46c75066..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/OrcidGatewayImpl.java +++ /dev/null @@ -1,40 +0,0 @@ -package at.tuwien.gateway.impl; - -import at.tuwien.api.orcid.OrcidDto; -import at.tuwien.exception.OrcidNotFoundException; -import at.tuwien.gateway.OrcidGateway; -import lombok.extern.log4j.Log4j2; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.client.ResourceAccessException; -import org.springframework.web.client.RestTemplate; - -@Log4j2 -@Service -public class OrcidGatewayImpl implements OrcidGateway { - - private final RestTemplate restTemplate; - - public OrcidGatewayImpl() { - this.restTemplate = new RestTemplate(); - } - - @Override - public OrcidDto findByUrl(String url) throws OrcidNotFoundException { - final HttpHeaders headers = new HttpHeaders(); - headers.set("Accept", "application/json"); - final ResponseEntity<OrcidDto> response; - try { - log.trace("call orcid path {}", url); - response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(null, headers), OrcidDto.class); - } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable e) { - log.error("Failed to retrieve ORCID metadata from URL {}: {}", url, e.getMessage()); - throw new OrcidNotFoundException("Failed to retrieve ORCID metadata from URL " + url + ": " + e.getMessage()); - } - return response.getBody(); - } -} \ No newline at end of file diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/QueryServiceGatewayImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/QueryServiceGatewayImpl.java deleted file mode 100644 index 093ad37d18..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/QueryServiceGatewayImpl.java +++ /dev/null @@ -1,84 +0,0 @@ -package at.tuwien.gateway.impl; - -import at.tuwien.api.database.query.QueryDto; -import at.tuwien.api.identifier.IdentifierSaveDto; -import at.tuwien.exception.QueryNotFoundException; -import at.tuwien.exception.RemoteUnavailableException; -import at.tuwien.gateway.QueryServiceGateway; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.client.ResourceAccessException; -import org.springframework.web.client.RestTemplate; - -@Slf4j -@Service -public class QueryServiceGatewayImpl implements QueryServiceGateway { - - private final RestTemplate restTemplate; - - @Autowired - public QueryServiceGatewayImpl(RestTemplate restTemplate) { - this.restTemplate = restTemplate; - } - - @Override - public QueryDto find(Long databaseId, IdentifierSaveDto identifier, String authorization) throws QueryNotFoundException, - RemoteUnavailableException { - final HttpHeaders headers = new HttpHeaders(); - headers.set("Authorization", authorization); - final String url = - "/api/database/" + databaseId + "/query/" + identifier.getQueryId(); - final ResponseEntity<QueryDto> response; - try { - log.trace("call gateway path {}", url); - response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(null, headers), QueryDto.class); - } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable e) { - log.error("Query service not available for database with id {} for query with id {}, reason {}", - databaseId, identifier.getQueryId(), e.getMessage()); - throw new RemoteUnavailableException("Query service not available", e); - } - if (response.getStatusCode().equals(HttpStatus.NOT_FOUND)) { - log.error("Query not found for and database with id {} for query with id {}", - databaseId, identifier.getQueryId()); - throw new QueryNotFoundException("Query not found"); - } - if (response.getStatusCode().equals(HttpStatus.UNAUTHORIZED)) { - log.error("Query not authorized for and database with id {} for query with id {}", - databaseId, identifier.getQueryId()); - throw new RemoteUnavailableException("Query not authorized"); - } - log.debug("found query {}", response.getBody()); - return response.getBody(); - } - - @Override - public byte[] export(Long databaseId, Long queryId) - throws RemoteUnavailableException, QueryNotFoundException { - final String url = "/database/" + databaseId + "/query/" + queryId + "/export"; - final HttpHeaders headers = new HttpHeaders(); - headers.add("Accept", "text/csv"); - final ResponseEntity<byte[]> response; - try { - log.trace("call gateway path {}", url); - response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(null, headers), byte[].class); - } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable e) { - log.error("Query service not available: {}", e.getMessage()); - throw new RemoteUnavailableException("Query service not available", e); - } - if (response.getStatusCode().equals(HttpStatus.NOT_FOUND)) { - log.error("Query not found for and database with id {} for query with id {}", - databaseId, queryId); - throw new QueryNotFoundException("Query not found"); - } - if (response.getStatusCode().equals(HttpStatus.UNAUTHORIZED)) { - log.error("Query not authorized for and database with id {} for query with id {}", - databaseId, queryId); - throw new RemoteUnavailableException("Query not authorized"); - } - log.debug("found query {}", response.getBody()); - return response.getBody(); - } -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/RorGatewayImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/RorGatewayImpl.java deleted file mode 100644 index a9c0970694..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/gateway/impl/RorGatewayImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -package at.tuwien.gateway.impl; - -import at.tuwien.api.ror.RorDto; -import at.tuwien.exception.OrcidNotFoundException; -import at.tuwien.exception.RorNotFoundException; -import at.tuwien.gateway.RorGateway; -import lombok.extern.log4j.Log4j2; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpServerErrorException; -import org.springframework.web.client.ResourceAccessException; -import org.springframework.web.client.RestTemplate; - -@Log4j2 -@Service -public class RorGatewayImpl implements RorGateway { - - private final RestTemplate restTemplate; - - public RorGatewayImpl() { - this.restTemplate = new RestTemplate(); - } - - @Override - public RorDto findById(String id) throws RorNotFoundException { - final HttpHeaders headers = new HttpHeaders(); - headers.set("Accept", "application/json"); - final String url = "https://api.ror.org/organizations/" + id; - final ResponseEntity<RorDto> response; - try { - log.trace("call ror path {}", url); - response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(null, headers), RorDto.class); - } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable e) { - log.error("Failed to retrieve ROR metadata from URL {}: {}", url, e.getMessage()); - throw new RorNotFoundException("Failed to retrieve ROR metadata from URL " + url + ": " + e.getMessage()); - } - return response.getBody(); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/DataCiteMapper.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/DataCiteMapper.java deleted file mode 100644 index f47f17eae9..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/DataCiteMapper.java +++ /dev/null @@ -1,125 +0,0 @@ -package at.tuwien.mapper; - -import at.tuwien.api.datacite.doi.*; -import at.tuwien.entities.database.License; -import at.tuwien.entities.identifier.*; -import at.tuwien.utils.EnumToStringConverter; -import org.mapstruct.*; -import org.springframework.context.annotation.Profile; - -import java.util.List; - -@Profile("doi") -@Mapper(componentModel = "spring", uses = EnumToStringConverter.class) -public interface DataCiteMapper { - - default <T> List<T> list(T t) { - if (t == null) return null; - return List.of(t); - } - - @Mappings({ - @Mapping(target = "titles", source = "."), - @Mapping(target = "publisher", source = "publisher"), - @Mapping(target = "publicationYear", source = "publicationYear"), - @Mapping(target = "publicationMonth", source = "publicationMonth"), - @Mapping(target = "publicationDay", source = "publicationDay"), - @Mapping(target = "language", source = "language"), - @Mapping(target = "creators", source = "creators"), - }) - DataCiteCreateDoi identifierToDataCiteCreateDoi(Identifier identifier); - - default DataCiteCreateDoi identifierToDataCiteCreateDoi(Identifier identifier, String url, String prefix) { - return addParametersToCreateDoi( - identifierToDataCiteCreateDoi(identifier), - url, - prefix, - DataCiteDoiTypes.DATASET, - DataCiteDoiEvent.PUBLISH - ); - } - - DataCiteDoiTitle identifierTitleToDataCiteDoiTitle(IdentifierTitle data); - - default DataCiteDoiTitle.Type titleTypeToDataCiteDoiTitleType(TitleType data) { - if (data == null) { - return null; - } - return switch (data) { - case OTHER -> DataCiteDoiTitle.Type.OTHER; - case TRANSLATED_TITLE -> DataCiteDoiTitle.Type.TRANSLATED_TITLE; - case SUBTITLE -> DataCiteDoiTitle.Type.SUBTITLE; - case ALTERNATIVE_TITLE -> DataCiteDoiTitle.Type.ALTERNATIVE_TITLE; - }; - } - - default List<DataCiteDoiTitle> identifierToDataCiteDoiTitleList(Identifier data) { - return data.getTitles() - .stream() - .map(this::identifierTitleToDataCiteDoiTitle) - .toList(); - } - - DataCiteCreateDoi addParametersToCreateDoi(@MappingTarget DataCiteCreateDoi target, String url, String prefix, - DataCiteDoiTypes types, DataCiteDoiEvent event); - - @Mappings({ - @Mapping(target = "rights", source = "identifier"), - @Mapping(target = "rightsUri", source = "uri"), - }) - DataCiteDoiRights licenseToDoiRights(License license); - - @Mappings({ - @Mapping(target = "name", expression = "java(data.getLastname() + \", \" + data.getFirstname())"), - @Mapping(target = "givenName", source = "firstname"), - @Mapping(target = "familyName", source = "lastname"), - @Mapping(target = "nameType", expression = "java(nameTypeToDataCiteNameType(data.getNameType()))"), - @Mapping(target = "affiliation", expression = "java(list(creatorToDoiCreatorAffiliation(data)))"), - @Mapping(target = "nameIdentifier", expression = "java(list(creatorToDataCiteDoiCreatorNameIdentifier(data)))"), - }) - DataCiteDoiCreator creatorToDoiCreator(Creator data); - - DataCiteDoiCreatorNameIdentifier creatorToDataCiteDoiCreatorNameIdentifier(Creator data); - - /* keep */ - default String nameIdentifierSchemeTypeToUri(NameIdentifierSchemeType data) { - switch (data) { - case ROR -> { - return "https://ror.org/"; - } - case ORCID -> { - return "https://orcid.org/"; - } - case ISNI -> { - return "https://isni.org/isni/"; - } - case GRID -> { - return "https://www.grid.ac/"; - } - } - return null; - } - - /* keep */ - default DataCiteNameType nameTypeToDataCiteNameType(NameType data) { - if (data == null) { - return null; - } - return DataCiteNameType.valueOf(data.getName().toUpperCase()); - } - - @Mappings({ - @Mapping(target = "name", source = "affiliation"), - @Mapping(target = "affiliationIdentifier", source = "affiliationIdentifier"), - @Mapping(target = "affiliationScheme", source = "affiliationIdentifierScheme"), - @Mapping(target = "schemeUri", source = "affiliationIdentifierSchemeUri"), - }) - DataCiteDoiCreatorAffiliation creatorToDoiCreatorAffiliation(Creator data); - - @Mappings({ - @Mapping(target = "relatedIdentifier", source = "value"), - @Mapping(target = "relatedIdentifierType", source = "type"), - @Mapping(target = "relationType", source = "relation"), - }) - DataCiteDoiRelatedIdentifier relatedIdentifierToDoiRelatedIdentifier(RelatedIdentifier relatedIdentifier); -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/DocumentMapper.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/DocumentMapper.java deleted file mode 100644 index 9a4fc4840d..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/DocumentMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package at.tuwien.mapper; - -import org.mapstruct.Mapper; - -import java.time.Instant; -import java.util.Date; - -@Mapper(componentModel = "spring") -public interface DocumentMapper { - - org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(DocumentMapper.class); - - Date instantToDate(Instant data); - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/ExternalMapper.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/ExternalMapper.java deleted file mode 100644 index 8ab5797770..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/ExternalMapper.java +++ /dev/null @@ -1,76 +0,0 @@ -package at.tuwien.mapper; - -import at.tuwien.api.crossref.CrossrefDto; -import at.tuwien.api.orcid.OrcidDto; -import at.tuwien.api.orcid.activities.employments.affiliation.OrcidAffiliationGroupDto; -import at.tuwien.api.orcid.activities.employments.affiliation.group.OrcidEmploymentSummaryDto; -import at.tuwien.api.orcid.activities.employments.affiliation.group.summary.organization.disambiguated.OrcidDisambiguatedDto; -import at.tuwien.api.orcid.activities.employments.affiliation.group.summary.organization.disambiguated.OrcidDisambiguatedSourceTypeDto; -import at.tuwien.api.ror.RorDto; -import at.tuwien.api.user.external.ExternalMetadataDto; -import at.tuwien.api.user.external.ExternalResultType; -import at.tuwien.api.user.external.affiliation.ExternalAffiliationDto; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; - -@Mapper(componentModel = "spring", imports = {ExternalResultType.class}) -public interface ExternalMapper { - - - @Mappings({ - @Mapping(target = "givenNames", source = "person.name.givenNames.value"), - @Mapping(target = "familyName", source = "person.name.familyName.value"), - @Mapping(target = "type", expression = "java(ExternalResultType.PERSONAL)"), - @Mapping(target = "affiliations", source = "activitiesSummary.employments.affiliationGroup"), - }) - ExternalMetadataDto orcidDtoToExternalMetadataDto(OrcidDto data); - - @Mappings({ - @Mapping(target = "organizationName", source = "employmentSummary.organization.name"), - @Mapping(target = "ringgoldId", expression = "java(disambiguatedOrganizationToRinggoldId(data.getEmploymentSummary().getOrganization().getDisambiguatedOrganization()))"), - }) - ExternalAffiliationDto orcidEmploymentSummaryDtoToExternalAffiliationDto(OrcidEmploymentSummaryDto data); - - default ExternalAffiliationDto orcidAffiliationGroupDtoToExternalAffiliationDto(OrcidAffiliationGroupDto data) { - if (data == null || data.getSummaries() == null || data.getSummaries().length == 0) { - return null; - } - return ExternalAffiliationDto.builder() - .organizationName(data.getSummaries()[0].getEmploymentSummary().getOrganization().getName()) - .build(); - } - - default Long disambiguatedOrganizationToRinggoldId(OrcidDisambiguatedDto data) { - if (data.getSource().equals(OrcidDisambiguatedSourceTypeDto.RINGGOLD)) { - return Long.parseLong(data.getIdentifier()); - } - return null; - } - - default ExternalMetadataDto rorDtoToExternalMetadataDto(RorDto data) { - return ExternalMetadataDto.builder() - .affiliations(new ExternalAffiliationDto[]{ - ExternalAffiliationDto.builder() - .organizationName(data.getName()) - .build()}) - .type(ExternalResultType.ORGANIZATIONAL) - .build(); - } - - default ExternalMetadataDto crossrefDtoToExternalMetadataDto(CrossrefDto data) { - return ExternalMetadataDto.builder() - .affiliations(new ExternalAffiliationDto[]{ - ExternalAffiliationDto.builder() - .crossrefFunderId(data.getId()) - .organizationName(data.getPrefLabel().getLabel().getLiteralForm().getContent()) - .build()}) - .type(ExternalResultType.ORGANIZATIONAL) - .build(); - } - - @Mappings({ - @Mapping(target = "organizationName", source = "name"), - }) - ExternalAffiliationDto rorDtoToExternalAffiliationDto(RorDto data); -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/IdentifierMapper.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/IdentifierMapper.java deleted file mode 100644 index 3972cc4c55..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/IdentifierMapper.java +++ /dev/null @@ -1,87 +0,0 @@ -package at.tuwien.mapper; - -import at.tuwien.api.identifier.*; -import at.tuwien.entities.identifier.*; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.Named; - -@Mapper(componentModel = "spring") -public interface IdentifierMapper { - - @Mappings({ - @Mapping(target = "database.identifier", ignore = true), - }) - IdentifierDto identifierToIdentifierDto(Identifier data); - - @Mappings({ - @Mapping(target = "titles", ignore = true), - @Mapping(target = "descriptions", ignore = true), - }) - Identifier identifierCreateDtoToIdentifier(IdentifierSaveDto data); - - Identifier identifierUpdateDtoToIdentifier(IdentifierSaveDto data); - - IdentifierTitle identifierCreateTitleDtoToIdentifierTitle(IdentifierSaveTitleDto data); - - IdentifierDescription identifierCreateDescriptionDtoToIdentifierDescription(IdentifierSaveDescriptionDto data); - - IdentifierFunder identifierFunderSaveDtoToIdentifierFunder(IdentifierFunderSaveDto data); - - IdentifierSaveDto identifierUpdateDtoToIdentifierCreateDto(IdentifierSaveDto data); - - RelatedIdentifierDto relatedIdentifierToRelatedIdentifierDto(RelatedIdentifier data); - - Identifier identifierDtoToIdentifier(IdentifierDto data); - - Creator creatorDtoToCreator(CreatorDto data); - - @Mappings({ - @Mapping(target = "nameIdentifierSchemeUri", source = "nameIdentifierScheme", qualifiedByName = "nameSchemaMapper"), - @Mapping(target = "affiliationIdentifierSchemeUri", source = "affiliationIdentifierScheme", qualifiedByName = "affiliationSchemaMapper"), - }) - Creator creatorCreateDtoToCreator(CreatorSaveDto data); - - RelatedIdentifier relatedIdentifierCreateDtoToRelatedIdentifier(RelatedIdentifierSaveDto data); - - IdentifierType identifierTypeDtoToIdentifierType(IdentifierTypeDto data); - - default String identifierToLocationUrl(String baseUrl, Identifier data) { - if (data.getType().equals(IdentifierType.SUBSET)) { - return baseUrl + "/database/" + data.getDatabase().getId() + "/query/" + data.getQueryId(); - } else if (data.getType().equals(IdentifierType.DATABASE)) { - return baseUrl + "/database/" + data.getDatabase().getId(); - } else if (data.getType().equals(IdentifierType.VIEW)) { - return baseUrl + "/database/" + data.getDatabase().getId() + "/view/" + data.getViewId(); - } else { - return null; - } - } - - @Named("nameSchemaMapper") - default String nameIdentifierSchemeToNameIdentifierSchemeUri(NameIdentifierSchemeTypeDto data) { - if (data == null) { - return null; - } - return switch (data) { - case ROR -> "https://ror.org/"; - case ORCID -> "https://orcid.org/"; - case GRID -> "https://grid.ac/"; - case ISNI -> "https://grid.ac/institutes/"; - }; - } - - @Named("affiliationSchemaMapper") - default String affiliationIdentifierSchemeTypeToAffiliationIdentifier(AffiliationIdentifierSchemeTypeDto data) { - if (data == null) { - return null; - } - return switch (data) { - case ROR -> "https://ror.org/"; - case GRID -> "https://grid.ac/institutes/"; - case ISNI -> "https://isni.org/"; - }; - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/UserMapper.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/UserMapper.java deleted file mode 100644 index bac8f626c2..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/mapper/UserMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package at.tuwien.mapper; - -import at.tuwien.api.user.GrantedAuthorityDto; -import at.tuwien.api.user.UserBriefDto; -import at.tuwien.api.user.UserDetailsDto; -import at.tuwien.api.user.UserDto; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; - -@Mapper(componentModel = "spring") -public interface UserMapper { - - /* keep */ - @Mappings({ - @Mapping(target = "id", expression = "java(data.getId().toString())") - }) - UserDetailsDto userBriefDtoToUserDetailsDto(UserBriefDto data); - - default GrantedAuthority grantedAuthorityDtoToGrantedAuthority(GrantedAuthorityDto data) { - return new SimpleGrantedAuthority(data.getAuthority()); - } -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/AccessRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/AccessRepository.java deleted file mode 100644 index 643d28edf2..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/AccessRepository.java +++ /dev/null @@ -1,24 +0,0 @@ - -package at.tuwien.repository.mdb; - -import at.tuwien.entities.database.DatabaseAccess; -import at.tuwien.entities.database.DatabaseAccessKey; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; -import java.util.UUID; - -@Repository -public interface AccessRepository extends JpaRepository<DatabaseAccess, DatabaseAccessKey> { - - /** - * Finds database access by given database id and user id. - * - * @param databaseId The database id. - * @param userId The user id. - * @return Non-empty optional if this database access exists, empty optional otherwise. - */ - Optional<DatabaseAccess> findByHdbidAndHuserid(Long databaseId, UUID userId); - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/ContainerRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/ContainerRepository.java deleted file mode 100644 index 04a8da854e..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/ContainerRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.container.Container; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ContainerRepository extends JpaRepository<Container, Long> { -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/CreatorRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/CreatorRepository.java deleted file mode 100644 index 916417563b..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/CreatorRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.identifier.Creator; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface CreatorRepository extends JpaRepository<Creator, Long> { - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/DatabaseRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/DatabaseRepository.java deleted file mode 100644 index df6ec32168..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/DatabaseRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.database.Database; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface DatabaseRepository extends JpaRepository<Database, Long> { -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/IdentifierDescriptionRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/IdentifierDescriptionRepository.java deleted file mode 100644 index 7c93a9b27f..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/IdentifierDescriptionRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.identifier.IdentifierDescription; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface IdentifierDescriptionRepository extends JpaRepository<IdentifierDescription, Long> { -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/IdentifierRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/IdentifierRepository.java deleted file mode 100644 index 37ae148a86..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/IdentifierRepository.java +++ /dev/null @@ -1,58 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.identifier.Identifier; -import at.tuwien.entities.identifier.IdentifierType; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Repository -public interface IdentifierRepository extends JpaRepository<Identifier, Long> { - - /** - * Finds identifiers by given database id. - * - * @param databaseId The database id. - * @return List of matching identifiers. - */ - List<Identifier> findByDatabaseId(Long databaseId); - - /** - * Finds identifiers by given query id. - * - * @param queryId The query id. - * @return List of matching identifiers. - */ - List<Identifier> findByQueryId(Long queryId); - - /** - * Finds identifiers by given database id and query id. - * - * @param databaseId The database id. - * @param queryId The query id. - * @return List of matching identifiers. - */ - List<Identifier> findByDatabaseIdAndQueryId(Long databaseId, Long queryId); - - /** - * Checks if an identifier exists by given database id and identifier type. - * - * @param databaseId The database id. - * @param type The identifier type. - * @return True if identifier exists, false otherwise. - */ - Boolean existsByDatabaseIdAndType(Long databaseId, IdentifierType type); - - /** - * Checks if an identifier exists by given database id, query id and identifier type. - * - * @param databaseId The database id. - * @param queryId The query id. - * @param type The identifier type. - * @return True if identifier exists, false otherwise. - */ - Boolean existsByDatabaseIdAndQueryIdAndType(Long databaseId, Long queryId, IdentifierType type); - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/IdentifierTitleRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/IdentifierTitleRepository.java deleted file mode 100644 index fbb52dc356..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/IdentifierTitleRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.identifier.IdentifierTitle; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface IdentifierTitleRepository extends JpaRepository<IdentifierTitle, Long> { -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/ImageRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/ImageRepository.java deleted file mode 100644 index b1020fdcc5..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/ImageRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.container.image.ContainerImage; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ImageRepository extends JpaRepository<ContainerImage, Long> { -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/LicenseRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/LicenseRepository.java deleted file mode 100644 index da00aae798..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/LicenseRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.database.License; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface LicenseRepository extends JpaRepository<License, String> { -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/RealmRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/RealmRepository.java deleted file mode 100644 index 6737727371..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/RealmRepository.java +++ /dev/null @@ -1,12 +0,0 @@ - -package at.tuwien.repository.mdb; - -import at.tuwien.entities.user.Realm; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.UUID; - -@Repository -public interface RealmRepository extends JpaRepository<Realm, UUID> { -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/TableRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/TableRepository.java deleted file mode 100644 index 5cbbeb08ba..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/TableRepository.java +++ /dev/null @@ -1,11 +0,0 @@ - -package at.tuwien.repository.mdb; - -import at.tuwien.entities.database.table.Table; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface TableRepository extends JpaRepository<Table, Long> { - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/UserRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/UserRepository.java deleted file mode 100644 index 7244c3455c..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/UserRepository.java +++ /dev/null @@ -1,22 +0,0 @@ - -package at.tuwien.repository.mdb; - -import at.tuwien.entities.user.User; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; -import java.util.UUID; - -@Repository -public interface UserRepository extends JpaRepository<User, UUID> { - - /** - * Finds an user by given username. - * - * @param username The username. - * @return Non-empty optional if this user exists, empty optional otherwise. - */ - Optional<User> findByUsername(String username); - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/ViewRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/ViewRepository.java deleted file mode 100644 index 7c1fec3922..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/mdb/ViewRepository.java +++ /dev/null @@ -1,11 +0,0 @@ - -package at.tuwien.repository.mdb; - -import at.tuwien.entities.database.View; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ViewRepository extends JpaRepository<View, Long> { - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/sdb/IdentifierIdxRepository.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/sdb/IdentifierIdxRepository.java deleted file mode 100644 index 45e42d1515..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/repository/sdb/IdentifierIdxRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien.repository.sdb; - -import at.tuwien.api.identifier.IdentifierDto; -import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface IdentifierIdxRepository extends ElasticsearchRepository<IdentifierDto, Long> { -} \ No newline at end of file diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/AccessService.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/AccessService.java deleted file mode 100644 index 1cb63e6a23..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/AccessService.java +++ /dev/null @@ -1,19 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.entities.database.DatabaseAccess; -import at.tuwien.exception.AccessDeniedException; - -import java.util.UUID; - -public interface AccessService { - - /** - * Finds database access by given database id and user id. - * - * @param databaseId The database id. - * @param userId The user id. - * @return The database access. - * @throws AccessDeniedException The access does not exist. - */ - DatabaseAccess find(Long databaseId, UUID userId) throws AccessDeniedException; -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/DatabaseService.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/DatabaseService.java deleted file mode 100644 index 1d081f4441..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/DatabaseService.java +++ /dev/null @@ -1,16 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.entities.database.Database; -import at.tuwien.exception.DatabaseNotFoundException; - -public interface DatabaseService { - - /** - * Finds a database by given id in the remote database service. - * - * @param databaseId The database id. - * @return The database. - * @throws DatabaseNotFoundException The database was not found. - */ - Database find(Long databaseId) throws DatabaseNotFoundException; -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/IdentifierService.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/IdentifierService.java deleted file mode 100644 index 6f01237644..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/IdentifierService.java +++ /dev/null @@ -1,122 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.api.identifier.BibliographyTypeDto; -import at.tuwien.api.identifier.IdentifierSaveDto; -import at.tuwien.api.identifier.IdentifierTypeDto; -import at.tuwien.entities.identifier.Identifier; -import at.tuwien.exception.*; -import org.springframework.core.io.InputStreamResource; -import org.springframework.stereotype.Service; - -import java.security.Principal; -import java.util.List; - -@Service -public interface IdentifierService { - - /** - * Finds all identifiers in the metadata database which are not deleted. Optionally, the result can be filtered by - * database id and/or query id. - * - * @param databaseId Optional. The database id. - * @param queryId Optional. The query id. - * @param viewId Optional. The view id. - * @return List of identifiers - */ - List<Identifier> findAll(IdentifierTypeDto type, Long databaseId, Long queryId, Long viewId); - - /** - * Finds all identifiers in the metadata database which are not deleted and filter by query id. - * - * @param databaseId The database id. - * @param queryId The query id. - * @return The identifier, if found. - */ - List<Identifier> findByDatabaseIdAndQueryId(Long databaseId, Long queryId); - - /** - * Creates a new identifier in the metadata database for a query or database. - * - * @param data The identifier. - * @param principal The authorization principal. - * @param authorization The authorization bearer. - * @return The created identifier from the metadata database if successful. - * @throws IdentifierPublishingNotAllowedException The identifier with this visibility could not be created. - * @throws QueryNotFoundException The query with this id (in the data) could not be created. - * @throws RemoteUnavailableException The connection to the Query Store could not be established by - * the database connector. - * @throws IdentifierAlreadyExistsException The identifier for this query/database already exists. - * @throws UserNotFoundException The user was not found in the metadata database. - * @throws DatabaseNotFoundException The database was not found in the metadata database. - */ - Identifier create(IdentifierSaveDto data, Principal principal, String authorization) - throws IdentifierPublishingNotAllowedException, QueryNotFoundException, - RemoteUnavailableException, IdentifierAlreadyExistsException, UserNotFoundException, - DatabaseNotFoundException, IdentifierRequestException, ViewNotFoundException; - - /** - * Finds an identifier by given id in the metadata database. - * - * @param identifierId The identifier id. - * @return The identifier, if successful. - * @throws IdentifierNotFoundException The identifier was not found in the metadata database or was deleted. - */ - Identifier find(Long identifierId) throws IdentifierNotFoundException; - - /** - * Export metadata for a identifier - * - * @param id The identifier id. - * @return The export, if successful. - * @throws IdentifierNotFoundException The identifier was not found in the metadata database or was deleted. - */ - InputStreamResource exportMetadata(Long id) throws IdentifierNotFoundException; - - /** - * Export metadata for bibliography for a identifier. - * - * @param id The identifier id. - * @param style The identifier bibliography style. Optional. Default: APA. - * @return The export, if successful. - * @throws IdentifierNotFoundException The identifier was not found in the metadata database or was deleted. - * @throws IdentifierRequestException The identifier style was not found. - */ - String exportBibliography(Long id, BibliographyTypeDto style) throws IdentifierNotFoundException, - IdentifierRequestException; - - /** - * Exports an identifier to XML - * - * @param identifierId The identifier id. - * @return The XML resource, if successful. - * @throws IdentifierNotFoundException The identifier was not found in the metadata database or was deleted. - * @throws QueryNotFoundException The query was not found in the metadata database or was deleted. - * @throws RemoteUnavailableException The connection to the Query Store could not be established by the database - * connector. - * @throws IdentifierRequestException The identifier does not allow for exporting. - */ - InputStreamResource exportResource(Long identifierId) - throws IdentifierNotFoundException, QueryNotFoundException, RemoteUnavailableException, - IdentifierRequestException; - - /** - * Updated the metadata (only) on the identifier for a given id in the metadata database. - * - * @param identifierId The identifier id. - * @param data The metadata. - * @param principal The user principal. - * @return The updated identifier if successful. - */ - Identifier update(Long identifierId, IdentifierSaveDto data, Principal principal, String authorization) - throws UserNotFoundException, DatabaseNotFoundException, QueryNotFoundException, RemoteUnavailableException, - IdentifierRequestException, IdentifierNotFoundException; - - /** - * Soft-deletes an identifier for a given id in the metadata database. Does not actually remove the entity from the - * database, but sets it as deleted. - * - * @param identifierId The identifier id. - * @throws IdentifierNotFoundException The identifier was not found in the metadata database or was deleted. - */ - void delete(Long identifierId) throws IdentifierNotFoundException; -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/MetadataService.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/MetadataService.java deleted file mode 100644 index 0c34b4d3bf..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/MetadataService.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.api.user.external.ExternalMetadataDto; -import at.tuwien.exception.DoiNotFoundException; -import at.tuwien.exception.OrcidNotFoundException; -import at.tuwien.exception.RemoteUnavailableException; -import at.tuwien.exception.RorNotFoundException; - -public interface MetadataService { - - /** - * Finds creator user metadata by remote service and user identifier. - * - * @param url The user identifier. - * @return The user metadata. - * @throws OrcidNotFoundException The provided identifier is of ORCID type and does not exist. - * @throws RorNotFoundException The provided identifier is of ROR type and does not exist. - * @throws RemoteUnavailableException The remote service is not supported. - */ - ExternalMetadataDto findByUrl(String url) throws OrcidNotFoundException, RorNotFoundException, RemoteUnavailableException, DoiNotFoundException; -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/UserService.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/UserService.java deleted file mode 100644 index b72b76179e..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/UserService.java +++ /dev/null @@ -1,16 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.entities.user.User; -import at.tuwien.exception.UserNotFoundException; - -public interface UserService { - - /** - * Finds a user with given username. - * - * @param username The username. - * @return The user. - * @throws UserNotFoundException The user does not exist. - */ - User findByUsername(String username) throws UserNotFoundException; -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/ViewService.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/ViewService.java deleted file mode 100644 index 9dc1637a54..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/ViewService.java +++ /dev/null @@ -1,8 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.entities.database.View; -import at.tuwien.exception.ViewNotFoundException; - -public interface ViewService { - View findById(Long id) throws ViewNotFoundException; -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java deleted file mode 100644 index c086a2990c..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.entities.database.DatabaseAccess; -import at.tuwien.exception.AccessDeniedException; -import at.tuwien.repository.mdb.AccessRepository; -import at.tuwien.service.AccessService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Optional; -import java.util.UUID; - -@Log4j2 -@Service -public class AccessServiceImpl implements AccessService { - - private final AccessRepository accessRepository; - - @Autowired - public AccessServiceImpl(AccessRepository accessRepository) { - this.accessRepository = accessRepository; - } - - @Override - public DatabaseAccess find(Long databaseId, UUID userId) throws AccessDeniedException { - final Optional<DatabaseAccess> optional = accessRepository.findByHdbidAndHuserid(databaseId, userId); - if (optional.isEmpty()) { - log.error("Failed to find access for user with id {}", userId); - throw new AccessDeniedException("Failed to find access"); - } - return optional.get(); - } -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/DataCiteIdentifierServiceImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/DataCiteIdentifierServiceImpl.java deleted file mode 100644 index ec3f714965..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/DataCiteIdentifierServiceImpl.java +++ /dev/null @@ -1,228 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.datacite.DataCiteBody; -import at.tuwien.api.datacite.DataCiteData; -import at.tuwien.api.datacite.doi.DataCiteCreateDoi; -import at.tuwien.api.datacite.doi.DataCiteDoi; -import at.tuwien.api.identifier.BibliographyTypeDto; -import at.tuwien.api.identifier.IdentifierSaveDto; -import at.tuwien.api.identifier.IdentifierTypeDto; -import at.tuwien.config.DataCiteConfig; -import at.tuwien.config.EndpointConfig; -import at.tuwien.entities.identifier.Identifier; -import at.tuwien.exception.*; -import at.tuwien.mapper.DataCiteMapper; -import at.tuwien.repository.mdb.IdentifierRepository; -import at.tuwien.service.IdentifierService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.Profile; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.client.HttpClientErrorException; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.DefaultUriBuilderFactory; - -import java.security.Principal; -import java.util.LinkedList; -import java.util.List; - -@Slf4j -@Primary -@Profile("doi") -@Service -public class DataCiteIdentifierServiceImpl implements IdentifierService { - - private final DataCiteConfig dataCiteConfig; - private final EndpointConfig endpointConfig; - private final DataCiteMapper dataCiteMapper; - private final RestTemplateBuilder restTemplateBuilder; - private final IdentifierRepository identifierRepository; - private final IdentifierService identifierService; - - public DataCiteIdentifierServiceImpl(DataCiteConfig dataCiteConfig, DataCiteMapper dataCiteMapper, - RestTemplateBuilder restTemplateBuilder, EndpointConfig endpointConfig, - IdentifierRepository identifierRepository, IdentifierServiceImpl identifierService) { - this.dataCiteConfig = dataCiteConfig; - this.dataCiteMapper = dataCiteMapper; - this.restTemplateBuilder = restTemplateBuilder.basicAuthentication(dataCiteConfig.getUsername(), - dataCiteConfig.getPassword()) - .uriTemplateHandler(new DefaultUriBuilderFactory(dataCiteConfig.getUrl())); - this.endpointConfig = endpointConfig; - this.identifierRepository = identifierRepository; - this.identifierService = identifierService; - } - - @Override - @Transactional(readOnly = true) - public List<Identifier> findAll(IdentifierTypeDto type, Long databaseId, Long queryId, Long viewId) { - return identifierService.findAll(type, databaseId, queryId, viewId); - } - - @Override - @Transactional(readOnly = true) - public List<Identifier> findByDatabaseIdAndQueryId(Long databaseId, Long queryId) { - return identifierService.findByDatabaseIdAndQueryId(databaseId, queryId); - } - - @Override - @Transactional(rollbackFor = {Exception.class}) - public Identifier create(IdentifierSaveDto data, Principal principal, String authorization) - throws IdentifierPublishingNotAllowedException, QueryNotFoundException, RemoteUnavailableException, - IdentifierAlreadyExistsException, UserNotFoundException, DatabaseNotFoundException, - IdentifierRequestException, ViewNotFoundException { - final Identifier identifier = identifierService.create(data, principal, authorization); - /* https://stackoverflow.com/questions/55090541/spring-data-jpa-lombok-unsupportedoperationexception-during-saving */ - if (identifier.getCreators() != null) { - identifier.setCreators(new LinkedList<>(identifier.getCreators())); - } - if (identifier.getTitles() != null) { - identifier.setTitles(new LinkedList<>(identifier.getTitles())); - } - if (identifier.getDescriptions() != null) { - identifier.setDescriptions(new LinkedList<>(identifier.getDescriptions())); - } - if (identifier.getFunders() != null) { - identifier.setFunders(new LinkedList<>(identifier.getFunders())); - } - if (identifier.getLicenses() != null) { - identifier.setLicenses(new LinkedList<>(identifier.getLicenses())); - } - if (identifier.getRelatedIdentifiers() != null) { - identifier.setRelatedIdentifiers(new LinkedList<>(identifier.getRelatedIdentifiers())); - } - /* end fix */ - RestTemplate restTemplate = restTemplateBuilder.build(); - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBasicAuth(dataCiteConfig.getUsername(), dataCiteConfig.getPassword()); - HttpEntity<DataCiteBody<DataCiteCreateDoi>> request = new HttpEntity<>( - DataCiteBody.<DataCiteCreateDoi>builder() - .data(DataCiteData.<DataCiteCreateDoi>builder() - .type("dois") - .attributes(dataCiteMapper.identifierToDataCiteCreateDoi(identifier, - endpointConfig.getWebsiteUrl() + "/pid/" + identifier.getId(), - dataCiteConfig.getPrefix())) - .build()) - .build(), - headers - ); - - try { - ResponseEntity<DataCiteBody<DataCiteDoi>> response = restTemplate.exchange("dois", HttpMethod.POST, - request, - new ParameterizedTypeReference<>() { - } - ); - - if (response.getStatusCode() != HttpStatus.CREATED || response.getBody() == null) { - log.error("Could not successfully create DOI. Response: {}", response); - throw new IdentifierRequestException("Could not successfully create DOI."); - } - - identifier.setDoi(response.getBody().getData().getAttributes().getDoi()); - this.identifierRepository.save(identifier); - } catch (HttpClientErrorException e) { - log.error("Invalid DOI metadata.", e); - throw new IdentifierRequestException("Invalid DOI metadata.", e); - } catch (RestClientException e) { - log.error("Could not fulfil request to DataCite server.", e); - throw new InternalError("Could not fulfil request to DataCite server.", e); - } - - return identifier; - } - - @Override - @Transactional(readOnly = true) - public Identifier find(Long identifierId) throws IdentifierNotFoundException { - return identifierService.find(identifierId); - } - - @Override - @Transactional(readOnly = true) - public InputStreamResource exportMetadata(Long id) throws IdentifierNotFoundException { - return identifierService.exportMetadata(id); - } - - @Override - @Transactional(readOnly = true) - public String exportBibliography(Long id, BibliographyTypeDto style) - throws IdentifierNotFoundException, IdentifierRequestException { - return identifierService.exportBibliography(id, style); - } - - @Override - @Transactional(readOnly = true) - public InputStreamResource exportResource(Long identifierId) - throws IdentifierNotFoundException, QueryNotFoundException, RemoteUnavailableException, - IdentifierRequestException { - return identifierService.exportResource(identifierId); - } - - @Override - @Transactional(rollbackFor = {Exception.class}) - public Identifier update(Long identifierId, IdentifierSaveDto data, Principal principal, String authorization) - throws UserNotFoundException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, - IdentifierRequestException, IdentifierNotFoundException { - Identifier identifier = identifierService.update(identifierId, data, principal, authorization); - if (identifier.getDoi() == null) { - return identifier; - } - - RestTemplate restTemplate = restTemplateBuilder.build(); - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.setBasicAuth(dataCiteConfig.getUsername(), dataCiteConfig.getPassword()); - HttpEntity<DataCiteBody<DataCiteCreateDoi>> request = new HttpEntity<>( - DataCiteBody.<DataCiteCreateDoi>builder() - .data(DataCiteData.<DataCiteCreateDoi>builder() - .type("dois") - .attributes(dataCiteMapper.identifierToDataCiteCreateDoi(identifier, - endpointConfig.getWebsiteUrl() + "/pid/" + identifier.getId(), - dataCiteConfig.getPrefix())) - .build()) - .build(), - headers - ); - - try { - ResponseEntity<DataCiteBody<DataCiteDoi>> response = restTemplate.exchange("dois/{doi}", HttpMethod.PUT, - request, - new ParameterizedTypeReference<>() { - }, - identifier.getDoi() - ); - - if (response.getStatusCode() != HttpStatus.OK || response.getBody() == null) { - log.error("Could not successfully create DOI. Response: {}", response); - throw new IdentifierRequestException("Could not successfully create DOI."); - } - - identifier.setDoi(response.getBody().getData().getAttributes().getDoi()); - this.identifierRepository.save(identifier); - } catch (HttpClientErrorException e) { - log.error("Invalid DOI metadata.", e); - throw new IdentifierRequestException("Invalid DOI metadata.", e); - } catch (RestClientException e) { - log.error("Could not fulfil request to DataCite server.", e); - throw new InternalError("Could not fulfil request to DataCite server.", e); - } - - return identifier; - } - - @Override - @Transactional - public void delete(Long identifierId) throws IdentifierNotFoundException { - identifierService.delete(identifierId); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java deleted file mode 100644 index 094995eb3e..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.entities.database.Database; -import at.tuwien.exception.DatabaseNotFoundException; -import at.tuwien.repository.mdb.DatabaseRepository; -import at.tuwien.service.DatabaseService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Optional; - -@Log4j2 -@Service -public class DatabaseServiceImpl implements DatabaseService { - - private final DatabaseRepository databaseRepository; - - @Autowired - public DatabaseServiceImpl(DatabaseRepository databaseRepository) { - this.databaseRepository = databaseRepository; - } - - @Override - @Transactional(readOnly = true) - public Database find(Long databaseId) throws DatabaseNotFoundException { - final Optional<Database> database = databaseRepository.findById(databaseId); - if (database.isEmpty()) { - log.error("Failed to find database"); - throw new DatabaseNotFoundException("Failed to find database"); - } - return database.get(); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java deleted file mode 100644 index 0a77b17ae1..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java +++ /dev/null @@ -1,353 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.database.query.QueryDto; -import at.tuwien.api.identifier.*; -import at.tuwien.config.EndpointConfig; -import at.tuwien.entities.database.Database; -import at.tuwien.entities.database.LanguageType; -import at.tuwien.entities.database.View; -import at.tuwien.entities.identifier.*; -import at.tuwien.entities.user.User; -import at.tuwien.exception.*; -import at.tuwien.gateway.QueryServiceGateway; -import at.tuwien.mapper.IdentifierMapper; -import at.tuwien.repository.sdb.IdentifierIdxRepository; -import at.tuwien.repository.mdb.IdentifierRepository; -import at.tuwien.service.DatabaseService; -import at.tuwien.service.IdentifierService; -import at.tuwien.service.UserService; -import at.tuwien.service.ViewService; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; -import org.springframework.core.io.InputStreamResource; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.thymeleaf.TemplateEngine; -import org.thymeleaf.context.Context; -import org.thymeleaf.exceptions.TemplateInputException; - -import java.io.ByteArrayInputStream; -import java.nio.charset.Charset; -import java.security.Principal; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Stream; - -@Slf4j -@Service -public class IdentifierServiceImpl implements IdentifierService { - - private final UserService userService; - private final ViewService viewService; - private final EndpointConfig endpointConfig; - private final TemplateEngine templateEngine; - private final DatabaseService databaseService; - private final IdentifierMapper identifierMapper; - private final QueryServiceGateway queryServiceGateway; - private final IdentifierRepository identifierRepository; - private final IdentifierIdxRepository identifierIdxRepository; - - public IdentifierServiceImpl(UserService userService, ViewService viewService, EndpointConfig endpointConfig, - TemplateEngine templateEngine, DatabaseService databaseService, - IdentifierMapper identifierMapper, QueryServiceGateway queryServiceGateway, - IdentifierRepository identifierRepository, - IdentifierIdxRepository identifierIdxRepository) { - this.userService = userService; - this.viewService = viewService; - this.endpointConfig = endpointConfig; - this.templateEngine = templateEngine; - this.databaseService = databaseService; - this.identifierMapper = identifierMapper; - this.queryServiceGateway = queryServiceGateway; - this.identifierRepository = identifierRepository; - this.identifierIdxRepository = identifierIdxRepository; - } - - @Override - @Transactional(readOnly = true) - public List<Identifier> findAll(IdentifierTypeDto type, Long databaseId, Long queryId, Long viewId) { - final List<Identifier> identifiers = this.identifierRepository.findAll(); - Stream<Identifier> stream = identifiers.stream(); - if (type != null) { - log.trace("filter by type: {}", type); - stream = stream.filter(i -> Objects.nonNull(i.getType())) - .filter(i -> i.getType().equals(identifierMapper.identifierTypeDtoToIdentifierType(type))); - } - if (databaseId != null) { - log.trace("filter by database id: {}", databaseId); - stream = stream.filter(i -> Objects.nonNull(i.getDatabaseId())) - .filter(i -> i.getDatabaseId().equals(databaseId)); - } - if (queryId != null) { - log.trace("filter by query id: {}", queryId); - stream = stream.filter(i -> Objects.nonNull(i.getQueryId())) - .filter(i -> i.getQueryId().equals(queryId)); - } - if (viewId != null) { - log.trace("filter by view id: {}", viewId); - stream = stream.filter(i -> Objects.nonNull(i.getViewId())) - .filter(i -> i.getViewId().equals(viewId)); - } - return stream.toList(); - } - - @Override - @Transactional(readOnly = true) - public List<Identifier> findByDatabaseIdAndQueryId(Long databaseId, Long queryId) { - return identifierRepository.findByDatabaseIdAndQueryId(databaseId, queryId); - } - - @Override - @Transactional - public Identifier create(IdentifierSaveDto data, Principal principal, String authorization) - throws QueryNotFoundException, RemoteUnavailableException, IdentifierAlreadyExistsException, - UserNotFoundException, DatabaseNotFoundException, IdentifierPublishingNotAllowedException, - IdentifierRequestException, ViewNotFoundException { - /* check */ - if (data.getType().equals(IdentifierTypeDto.DATABASE) && identifierRepository.existsByDatabaseIdAndType(data.getDatabaseId(), IdentifierType.DATABASE)) { - log.error("Identifier already issued for database with id {}", data.getDatabaseId()); - throw new IdentifierAlreadyExistsException("Database identifier already exists"); - } else if (data.getType().equals(IdentifierTypeDto.SUBSET) && identifierRepository.existsByDatabaseIdAndQueryIdAndType(data.getDatabaseId(), data.getQueryId(), IdentifierType.SUBSET)) { - log.error("Identifier already issued for database with id {} and query with id {}", data.getDatabaseId(), data.getQueryId()); - throw new IdentifierAlreadyExistsException("Subset identifier already exists"); - } - /* create identifier */ - final Identifier identifier = identifierMapper.identifierCreateDtoToIdentifier(data); - final User creator = userService.findByUsername(principal.getName()); - identifier.setCreator(creator); - identifier.setDatabaseId(data.getDatabaseId()); - final Database database = databaseService.find(data.getDatabaseId()); - identifier.setDatabase(database); - if (data.getType().equals(IdentifierTypeDto.SUBSET)) { - log.debug("identifier type: subset"); - final QueryDto query = queryServiceGateway.find(data.getDatabaseId(), data, authorization); - identifier.setQuery(query.getQuery()); - identifier.setQueryId(query.getId()); - identifier.setQueryNormalized(query.getQueryNormalized()); - identifier.setQueryHash(query.getQueryHash()); - identifier.setExecution(query.getExecution()); - identifier.setResultNumber(query.getResultNumber()); - identifier.setResultHash(query.getResultHash()); - } else if (data.getType().equals(IdentifierTypeDto.VIEW)) { - log.debug("identifier type: view"); - final View view = viewService.findById(data.getViewId()); - identifier.setViewId(view.getId()); - identifier.setQuery(view.getQuery()); - identifier.setQueryNormalized(view.getQuery()); - identifier.setQueryHash(view.getQueryHash()); - } - /* create in metadata database */ - final Identifier entity = saveIdentifier(identifier, data.getCreators(), data.getRelatedIdentifiers(), - data.getTitles(), data.getDescriptions(), data.getFunders()); - log.info("Created identifier with id {} in metadata database", entity.getId()); - /* create in open search database */ - identifierIdxRepository.save(identifierMapper.identifierToIdentifierDto(entity)); - log.info("Created identifier with id {} in open search database", entity.getId()); - return entity; - } - - @Override - @Transactional(readOnly = true) - public Identifier find(Long identifierId) throws IdentifierNotFoundException { - final Optional<Identifier> optional = identifierRepository.findById(identifierId); - if (optional.isEmpty()) { - log.error("Identifier with id {} not existing", identifierId); - throw new IdentifierNotFoundException("Unable to find identifier"); - } - return optional.get(); - } - - @Override - @Transactional(readOnly = true) - public InputStreamResource exportMetadata(Long id) throws IdentifierNotFoundException { - /* check */ - final Identifier identifier = find(id); - /* context */ - final Context context = new Context(); - if (identifier.getDoi() != null) { - context.setVariable("identifierType", "DOI"); - context.setVariable("identifier", identifier.getDoi()); - } else { - context.setVariable("identifierType", "PID"); - context.setVariable("identifier", endpointConfig.getWebsiteUrl() + "/pid/" + identifier.getId()); - } - context.setVariable("language", identifier.getLanguage()); - context.setVariable("creators", identifier.getCreators()); - context.setVariable("titles", identifier.getTitles()); - context.setVariable("publisher", identifier.getPublisher()); - context.setVariable("publicationYear", identifier.getPublicationYear()); - context.setVariable("created", identifier.getCreated()); - context.setVariable("relatedIdentifiers", identifier.getRelatedIdentifiers()); - context.setVariable("funders", identifier.getFunders()); - context.setVariable("descriptions", identifier.getDescriptions()); - context.setVariable("licenses", identifier.getLicenses()); - /* map */ - final String body = templateEngine.process("doi.xml", context) - .replaceAll("\\s+", " "); - final InputStreamResource resource = new InputStreamResource(IOUtils.toInputStream(body, Charset.defaultCharset())); - log.debug("mapped file stream {}", resource.getDescription()); - return resource; - } - - @Override - @Transactional(readOnly = true) - public String exportBibliography(Long id, BibliographyTypeDto style) - throws IdentifierNotFoundException, IdentifierRequestException { - /* check */ - final Identifier identifier = find(id); - /* context */ - final Context context = new Context(); - if (identifier.getDoi() != null) { - context.setVariable("identifierType", "doi"); - context.setVariable("identifier", identifier.getDoi()); - } else { - context.setVariable("identifierType", "url"); - context.setVariable("identifier", endpointConfig.getWebsiteUrl() + "/pid/" + identifier.getId()); - } - context.setVariable("creator", identifier.getCreator()); - context.setVariable("creators", identifier.getCreators()); - context.setVariable("title", preferTitle(identifier.getTitles())); - context.setVariable("publisher", identifier.getPublisher()); - context.setVariable("publicationMonth", identifier.getPublicationMonth()); - context.setVariable("publicationYear", identifier.getPublicationYear()); - /* map */ - final String template = "cite_" + style.name().toLowerCase() + ".txt"; - final String body; - try { - body = templateEngine.process(template, context); - } catch (TemplateInputException e) { - log.error("Failed to load template: {}", e.getMessage()); - throw new IdentifierRequestException("Failed to load template", e); - } - log.trace("mapped bibliography {}", body); - return body; - } - - @Override - @Transactional(readOnly = true) - public InputStreamResource exportResource(Long identifierId) throws IdentifierNotFoundException, - QueryNotFoundException, RemoteUnavailableException, IdentifierRequestException { - /* check */ - final Identifier identifier = find(identifierId); - if (identifier.getType().equals(IdentifierType.DATABASE)) { - log.error("Failed to find identifier with id {} as it refers to a database and not a query", identifierId); - throw new IdentifierRequestException("Failed to find identifier"); - } - /* subset */ - final byte[] file = queryServiceGateway.export(identifier.getDatabase().getId(), identifier.getQueryId()); - final InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(file)); - log.trace("found resource {}", resource); - return resource; - } - - @Override - @Transactional - public Identifier update(Long identifierId, IdentifierSaveDto data, Principal principal, String authorization) - throws UserNotFoundException, DatabaseNotFoundException, QueryNotFoundException, RemoteUnavailableException, - IdentifierNotFoundException { - /* find doi */ - final Identifier oldIdentifier = find(identifierId); - /* create identifier */ - final Identifier identifier = identifierMapper.identifierUpdateDtoToIdentifier(data); - identifier.setId(identifierId); - identifier.setDoi(oldIdentifier.getDoi()); - final User creator = userService.findByUsername(principal.getName()); - identifier.setCreator(creator); - final Database database = databaseService.find(data.getDatabaseId()); - identifier.setDatabase(database); - if (data.getType().equals(IdentifierTypeDto.SUBSET)) { - log.debug("identifier describes a subset"); - final IdentifierSaveDto payload = identifierMapper.identifierUpdateDtoToIdentifierCreateDto(data); - final QueryDto query = queryServiceGateway.find(data.getDatabaseId(), payload, authorization); - identifier.setQuery(query.getQuery()); - identifier.setQueryId(query.getId()); - identifier.setQueryNormalized(query.getQueryNormalized()); - identifier.setQueryHash(query.getQueryHash()); - identifier.setExecution(query.getExecution()); - identifier.setResultNumber(query.getResultNumber()); - identifier.setResultHash(query.getResultHash()); - } - /* update in metadata database */ - final Identifier entity = saveIdentifier(identifier, data.getCreators(), data.getRelatedIdentifiers(), - data.getTitles(), data.getDescriptions(), data.getFunders()); - log.info("Updated identifier with id {} in metadata database", identifierId); - /* update in open search database */ - identifierIdxRepository.save(identifierMapper.identifierToIdentifierDto(entity)); - log.info("Updated identifier with id {} in open search database", identifierId); - return entity; - } - - @Override - @Transactional - public void delete(Long identifierId) throws IdentifierNotFoundException { - /* delete in metadata database */ - if (!identifierRepository.existsById(identifierId)) { - log.error("Failed to find identifier with id {} in metadata database", identifierId); - throw new IdentifierNotFoundException("Failed to find identifier with id " + identifierId + " in metadata database"); - } - identifierRepository.deleteById(identifierId); - log.info("Deleted identifier with id {} in metadata database", identifierId); - /* delete in elastic search */ - if (!identifierIdxRepository.existsById(identifierId)) { - log.error("Failed to find identifier with id {} in open search database", identifierId); - throw new IdentifierNotFoundException("Failed to find identifier with id " + identifierId + " in open search database"); - } - identifierIdxRepository.deleteById(identifierId); - log.info("Deleted identifier with id {} in open search database", identifierId); - } - - public IdentifierTitle preferTitle(List<IdentifierTitle> titles) { - final Optional<IdentifierTitle> optional = titles.stream() - .filter(t -> Objects.nonNull(t.getLanguage())) - .filter(t -> t.getLanguage().equals(LanguageType.EN)) - .findFirst(); - return optional.orElseGet(() -> titles.get(0)); - } - - public Identifier saveIdentifier(Identifier identifier, List<CreatorSaveDto> creators, - List<RelatedIdentifierSaveDto> relatedIdentifiers, - List<IdentifierSaveTitleDto> titles, - List<IdentifierSaveDescriptionDto> descriptions, - List<IdentifierFunderSaveDto> funders) { - /* create in metadata database */ - if (creators != null) { - identifier.setCreators(creators.stream() - .map(identifierMapper::creatorCreateDtoToCreator) - .peek(c -> c.setIdentifier(identifier)) - .toList()); - log.debug("set {} creator(s)", identifier.getCreators().size()); - } - if (relatedIdentifiers != null) { - identifier.setRelatedIdentifiers(relatedIdentifiers.stream() - .map(identifierMapper::relatedIdentifierCreateDtoToRelatedIdentifier) - .peek(r -> r.setIdentifier(identifier)) - .toList()); - log.debug("set {} related identifier(s)", identifier.getRelatedIdentifiers().size()); - } - if (titles != null) { - identifier.setTitles(null); - identifier.setTitles(titles.stream() - .map(identifierMapper::identifierCreateTitleDtoToIdentifierTitle) - .peek(t -> t.setIdentifier(identifier)) - .toList()); - log.debug("set {} title(s)", identifier.getTitles().size()); - } - if (descriptions != null) { - identifier.setDescriptions(descriptions.stream() - .map(identifierMapper::identifierCreateDescriptionDtoToIdentifierDescription) - .peek(d -> d.setIdentifier(identifier)) - .toList()); - log.debug("set {} description(s)", identifier.getDescriptions().size()); - } - if (funders != null) { - identifier.setFunders(funders.stream() - .map(identifierMapper::identifierFunderSaveDtoToIdentifierFunder) - .peek(d -> d.setIdentifier(identifier)) - .toList()); - log.debug("set {} funder(s)", identifier.getFunders().size()); - } - return identifierRepository.save(identifier); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/MetadataServiceImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/MetadataServiceImpl.java deleted file mode 100644 index 8c06fcfede..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/MetadataServiceImpl.java +++ /dev/null @@ -1,67 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.crossref.CrossrefDto; -import at.tuwien.api.orcid.OrcidDto; -import at.tuwien.api.ror.RorDto; -import at.tuwien.api.user.external.ExternalMetadataDto; -import at.tuwien.exception.DoiNotFoundException; -import at.tuwien.exception.OrcidNotFoundException; -import at.tuwien.exception.RemoteUnavailableException; -import at.tuwien.exception.RorNotFoundException; -import at.tuwien.gateway.CrossrefGateway; -import at.tuwien.gateway.OrcidGateway; -import at.tuwien.gateway.RorGateway; -import at.tuwien.mapper.ExternalMapper; -import at.tuwien.service.MetadataService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Slf4j -@Service -public class MetadataServiceImpl implements MetadataService { - - private final RorGateway rorGateway; - private final OrcidGateway orcidGateway; - private final ExternalMapper externalMapper; - private final CrossrefGateway crossrefGateway; - - @Autowired - public MetadataServiceImpl(RorGateway rorGateway, OrcidGateway orcidGateway, ExternalMapper externalMapper, - CrossrefGateway crossrefGateway) { - this.rorGateway = rorGateway; - this.orcidGateway = orcidGateway; - this.externalMapper = externalMapper; - this.crossrefGateway = crossrefGateway; - } - - @Override - public ExternalMetadataDto findByUrl(String url) throws OrcidNotFoundException, RorNotFoundException, - RemoteUnavailableException, DoiNotFoundException { - if (url.contains("orcid.org")) { - final OrcidDto orcidDto = orcidGateway.findByUrl(url); - return externalMapper.orcidDtoToExternalMetadataDto(orcidDto); - } else if (url.contains("ror.org")) { - final int idx = url.lastIndexOf('/'); - if (idx + 1 >= url.length()) { - log.error("Failed to find metadata from ROR URL: too short"); - throw new RorNotFoundException("Failed to find metadata from ROR URL: too short"); - } - final String id = url.substring(idx + 1); - final RorDto rorDto = rorGateway.findById(id); - return externalMapper.rorDtoToExternalMetadataDto(rorDto); - } else if (url.contains("doi.org")) { - final int idx = url.indexOf("doi.org/"); - if (idx + 1 >= url.length()) { - log.error("Failed to find metadata from CrossRef URL: too short"); - throw new RorNotFoundException("Failed to find metadata from CrossRef URL: too short"); - } - final String id = url.substring(idx + 8); - final CrossrefDto crossrefDto = crossrefGateway.findById(id); - return externalMapper.crossrefDtoToExternalMetadataDto(crossrefDto); - } - log.error("Failed to find metadata: unsupported identifier {}", url); - throw new RemoteUnavailableException("Failed to find metadata: unsupported identifier " + url); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java deleted file mode 100644 index 47f1ac286b..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.entities.user.User; -import at.tuwien.exception.UserNotFoundException; -import at.tuwien.repository.mdb.UserRepository; -import at.tuwien.service.UserService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -@Log4j2 -@Service -public class UserServiceImpl implements UserService { - - private final UserRepository userRepository; - - @Autowired - public UserServiceImpl(UserRepository userRepository) { - this.userRepository = userRepository; - } - - @Override - public User findByUsername(String username) throws UserNotFoundException { - final Optional<User> optional = userRepository.findByUsername(username); - if (optional.isEmpty()) { - log.error("Failed to retrieve user with username {}", username); - throw new UserNotFoundException("Failed to retrieve user"); - } - return optional.get(); - } - -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java deleted file mode 100644 index 298ea15687..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.entities.database.View; -import at.tuwien.exception.ViewNotFoundException; -import at.tuwien.repository.mdb.ViewRepository; -import at.tuwien.service.ViewService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -@Log4j2 -@Service -public class ViewServiceImpl implements ViewService { - - private final ViewRepository viewRepository; - - @Autowired - public ViewServiceImpl(ViewRepository viewRepository) { - this.viewRepository = viewRepository; - } - - @Override - public View findById(Long id) throws ViewNotFoundException { - final Optional<View> optional = viewRepository.findById(id); - if (optional.isEmpty()) { - log.error("Failed to find view with id: {}", id); - throw new ViewNotFoundException("Failed to find view with id: " + id); - } - return optional.get(); - } -} diff --git a/dbrepo-identifier-service/services/src/main/java/at/tuwien/utils/EnumToStringConverter.java b/dbrepo-identifier-service/services/src/main/java/at/tuwien/utils/EnumToStringConverter.java deleted file mode 100644 index 2e53ae6cdc..0000000000 --- a/dbrepo-identifier-service/services/src/main/java/at/tuwien/utils/EnumToStringConverter.java +++ /dev/null @@ -1,15 +0,0 @@ -package at.tuwien.utils; - -import org.mapstruct.TargetType; - -public class EnumToStringConverter { - - public static String convert(Enum<?> source) { - return source == null ? null : source.toString(); - } - - public static <E extends Enum<E>> E convert(String source, @TargetType Class<E> enumType) { - // You probably need something else here as the methods are not symmetrical - return source == null ? null : Enum.valueOf( enumType, source ); - } -} diff --git a/dbrepo-identifier-service/~ b/dbrepo-identifier-service/~ deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-metadata-db/pom.xml b/dbrepo-metadata-db/pom.xml deleted file mode 100644 index 35b8b185da..0000000000 --- a/dbrepo-metadata-db/pom.xml +++ /dev/null @@ -1,93 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-parent</artifactId> - <version>3.0.6</version> - </parent> - - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-db</artifactId> - <version>1.3.0</version> - <name>dbrepo-metadata-db</name> - <description>Demo project for Spring Boot</description> - - <packaging>pom</packaging> - <modules> - <module>api</module> - <module>entities</module> - <module>querystore</module> - <module>oai</module> - <module>test</module> - </modules> - - <properties> - <java.version>17</java.version> - <maven.compiler.source>${java.version}</maven.compiler.source> - <maven.compiler.target>${java.version}</maven.compiler.target> - <jsql-parser.version>4.6</jsql-parser.version> - <jackson-datatype.version>2.15.0</jackson-datatype.version> - <commons.version>2.11.0</commons.version> - <springdoc-openapi.version>2.1.0</springdoc-openapi.version> - <opensearch-client.version>1.1.0</opensearch-client.version> - </properties> - - <dependencies> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-security</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-jpa</artifactId> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>spring-data-opensearch</artifactId> - <version>${opensearch-client.version}</version> - </dependency> - <!-- Mapping --> - <dependency> - <groupId>com.fasterxml.jackson.datatype</groupId> - <artifactId>jackson-datatype-jsr310</artifactId> - <version>${jackson-datatype.version}</version> - </dependency> - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>${commons.version}</version> - </dependency> - <!-- Utils --> - <dependency> - <groupId>com.google.guava</groupId> - <artifactId>guava</artifactId> - <version>31.1-jre</version> - </dependency> - <!-- SQL Parser --> - <dependency> - <groupId>com.github.jsqlparser</groupId> - <artifactId>jsqlparser</artifactId> - <version>${jsql-parser.version}</version> - </dependency> - <!-- IDE --> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - <!-- OpenAPI --> - <dependency> - <groupId>org.springdoc</groupId> - <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> - <version>${springdoc-openapi.version}</version> - </dependency> - </dependencies> - - <!-- build at.tuwien.gateway.config in ./rest-service/pom.xml --> - -</project> diff --git a/dbrepo-semantics-service/.gitignore b/dbrepo-semantics-service/.gitignore deleted file mode 100644 index 7731f1adf2..0000000000 --- a/dbrepo-semantics-service/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### Generated ### -ready - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/dbrepo-semantics-service/.mvn/wrapper/MavenWrapperDownloader.java b/dbrepo-semantics-service/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index a45eb6ba26..0000000000 --- a/dbrepo-semantics-service/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if (mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if (mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if (!outputFile.getParentFile().exists()) { - if (!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/dbrepo-semantics-service/.mvn/wrapper/maven-wrapper.jar b/dbrepo-semantics-service/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 diff --git a/dbrepo-semantics-service/.mvn/wrapper/maven-wrapper.properties b/dbrepo-semantics-service/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 642d572ce9..0000000000 --- a/dbrepo-semantics-service/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/dbrepo-semantics-service/Dockerfile b/dbrepo-semantics-service/Dockerfile deleted file mode 100644 index 8a332ae36c..0000000000 --- a/dbrepo-semantics-service/Dockerfile +++ /dev/null @@ -1,39 +0,0 @@ -###### FIRST STAGE ###### -FROM dbrepo-metadata-db:latest as dependency -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -###### SECOND STAGE ###### -FROM maven:3-openjdk-17 as build -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -COPY ./pom.xml ./ - -RUN mvn -fn -B dependency:go-offline > /dev/null - -COPY --from=dependency /root/.m2/repository/at/tuwien /root/.m2/repository/at/tuwien - -COPY ./rest-service ./rest-service -COPY ./services ./services -COPY ./report ./report - -# Make sure it compiles -RUN mvn -q clean package -DskipTests - -###### THIRD STAGE ###### -FROM openjdk:17-alpine as runtime -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -ENV METADATA_DB=fda -ENV METADATA_USERNAME=root -ENV METADATA_PASSWORD=dbrepo -ENV LOG_LEVEL=debug -ENV JWT_ISSUER="http://localhost/realms/dbrepo" -ENV JWT_PUBKEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB" - -WORKDIR /app - -COPY --from=build ./rest-service/target/rest-service-*.jar ./semantics-service.jar - -EXPOSE 9091 - -ENTRYPOINT ["java", "-Dlog4j2.formatMsgNoLookups=true", "-jar", "./semantics-service.jar"] diff --git a/dbrepo-semantics-service/README.md b/dbrepo-semantics-service/README.md deleted file mode 100644 index 859ab6d6ac..0000000000 --- a/dbrepo-semantics-service/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Semantics Service - -## Actuator - -- Actuator Info: http://localhost:9097/actuator/info -- Actuator Health: http://localhost:9097/actuator/health -- Actuator Prometheus: http://localhost:9097/actuator/prometheus - -## Swagger UI Endpoints - -- Swagger UI: http://localhost:9097/swagger-ui/index.html - -## OpenAPI Endpoints - -- OpenAPI v3 as .yaml: http://localhost:9097/v3/api-docs.yaml \ No newline at end of file diff --git a/dbrepo-semantics-service/mvnw b/dbrepo-semantics-service/mvnw deleted file mode 100755 index a16b5431b4..0000000000 --- a/dbrepo-semantics-service/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/dbrepo-semantics-service/mvnw.cmd b/dbrepo-semantics-service/mvnw.cmd deleted file mode 100644 index c8d43372c9..0000000000 --- a/dbrepo-semantics-service/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM https://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/dbrepo-semantics-service/pom.xml b/dbrepo-semantics-service/pom.xml deleted file mode 100644 index f9ee92778c..0000000000 --- a/dbrepo-semantics-service/pom.xml +++ /dev/null @@ -1,255 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-parent</artifactId> - <version>3.0.6</version> - </parent> - - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-semantics-service</artifactId> - <version>1.3.0</version> - <name>dbrepo-semantics-service</name> - <description>Service that manages the tables</description> - - <packaging>pom</packaging> - <modules> - <module>rest-service</module> - <module>services</module> - <module>report</module> - </modules> - - <properties> - <java.version>17</java.version> - <spring-cloud.version>4.0.2</spring-cloud.version> - <mapstruct.version>1.5.5.Final</mapstruct.version> - <swagger.version>2.2.9</swagger.version> - <jacoco.version>0.8.10</jacoco.version> - <jwt.version>4.3.0</jwt.version> - <opencsv.version>5.7.1</opencsv.version> - <super-csv.version>2.4.0</super-csv.version> - <jsql.version>4.6</jsql.version> - <c3p0.version>0.9.5.5</c3p0.version> - <c3p0-hibernate.version>6.2.2.Final</c3p0-hibernate.version> - <apache-jena.version>4.8.0</apache-jena.version> - <springdoc-openapi.version>2.1.0</springdoc-openapi.version> - <hsqldb.version>2.7.2</hsqldb.version> - <opensearch-client.version>1.1.0</opensearch-client.version> - <opensearch-rest-client.version>2.8.0</opensearch-rest-client.version> - <jackson.version>2.15.2</jackson.version> - </properties> - - <dependencies> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-validation</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-bootstrap</artifactId> - <version>${spring-cloud.version}</version> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-security</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.security</groupId> - <artifactId>spring-security-test</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-actuator</artifactId> - </dependency> - <!-- Authentication --> - <dependency> - <groupId>com.auth0</groupId> - <artifactId>java-jwt</artifactId> - <version>${jwt.version}</version> - </dependency> - <!-- Entities and API --> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-db-entites</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-db-api</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-jpa</artifactId> - </dependency> - <!-- Data Source --> - <dependency> - <groupId>org.mariadb.jdbc</groupId> - <artifactId>mariadb-java-client</artifactId> - <version>${mariadb.version}</version> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>spring-data-opensearch</artifactId> - <version>${opensearch-client.version}</version> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>spring-data-opensearch-starter</artifactId> - <version>${opensearch-client.version}</version> - </dependency> - <!-- OpenSearch --> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-core</artifactId> - <version>${jackson.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> - <version>${jackson.version}</version> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>opensearch-rest-high-level-client</artifactId> - <version>${opensearch-rest-client.version}</version> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>opensearch-rest-client-sniffer</artifactId> - <version>${opensearch-rest-client.version}</version> - </dependency> - <!-- Testing --> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>spring-data-opensearch-test-autoconfigure</artifactId> - <version>${opensearch-client.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <exclusions> - <exclusion> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-vintage-engine</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.hsqldb</groupId> - <artifactId>hsqldb</artifactId> - <version>${hsqldb.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-db-test</artifactId> - <version>${project.version}</version> - </dependency> - <!-- RDF --> - <dependency> - <groupId>org.apache.jena</groupId> - <artifactId>jena-core</artifactId> - <version>${apache-jena.version}</version> - </dependency> - <dependency> - <groupId>org.apache.jena</groupId> - <artifactId>jena-arq</artifactId> - <version>${apache-jena.version}</version> - </dependency> - <dependency> - <groupId>org.apache.jena</groupId> - <artifactId>jena-fuseki-fulljar</artifactId> - <version>${apache-jena.version}</version> - </dependency> - <!-- IDE --> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - <!-- Mapping --> - <dependency> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct-processor</artifactId> - <version>${mapstruct.version}</version> - <optional>true</optional><!-- IntelliJ --> - </dependency> - <dependency> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct</artifactId> - <version>${mapstruct.version}</version> - </dependency> - <!-- Swagger --> - <dependency> - <groupId>org.springdoc</groupId> - <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> - <version>${springdoc-openapi.version}</version> - </dependency> - <!-- Open API --> - <dependency> - <groupId>org.springdoc</groupId> - <artifactId>springdoc-openapi-starter-webmvc-api</artifactId> - <version>${springdoc-openapi.version}</version> - </dependency> - </dependencies> - - <build> - <resources> - <resource> - <directory>${basedir}/src/main/resources</directory> - <filtering>true</filtering> - <includes> - <include>**/application*.yml</include> - <include>**/*.rdf</include> - <include>**/*.ttl</include> - </includes> - </resource> - </resources> - <plugins> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - <configuration> - <excludes> - <exclude>at/tuwien/mapper/**/*</exclude> - <exclude>at/tuwien/exception/**/*</exclude> - <exclude>at/tuwien/config/**/*</exclude> - <exclude>at/tuwien/auth/**/*</exclude> - <exclude>at/tuwien/handlers/**/*</exclude> - <exclude>**/DbrepoSemanticsServiceApplication.class</exclude> - </excludes> - </configuration> - <executions> - <execution> - <id>default-prepare-agent</id> - <goals> - <goal>prepare-agent</goal> - </goals> - </execution> - <execution> - <id>report</id> - <phase>verify</phase> - <goals> - <goal>report</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> diff --git a/dbrepo-semantics-service/report/pom.xml b/dbrepo-semantics-service/report/pom.xml deleted file mode 100644 index d8ee5dded0..0000000000 --- a/dbrepo-semantics-service/report/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-semantics-service</artifactId> - <version>1.3.0</version> - </parent> - - <artifactId>report</artifactId> - <version>1.3.0</version> - <name>dbrepo-semantics-service-report</name> - <description> - This module is only intended for the pipeline coverage report. See the detailed report in the - respective modules - </description> - - <properties> - <jacoco.version>0.8.7</jacoco.version> - </properties> - - <dependencies> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>rest-service</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>services</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - <executions> - <execution> - <id>report-aggregate</id> - <phase>verify</phase> - <goals> - <goal>report-aggregate</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/dbrepo-semantics-service/rest-service/pom.xml b/dbrepo-semantics-service/rest-service/pom.xml deleted file mode 100644 index b2ca890c1f..0000000000 --- a/dbrepo-semantics-service/rest-service/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-semantics-service</artifactId> - <version>1.3.0</version> - </parent> - - <artifactId>rest-service</artifactId> - <version>1.3.0</version> - <name>dbrepo-semantics-service-rest-service</name> - - <properties> - <jacoco.version>0.8.7</jacoco.version> - </properties> - - <dependencies> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>services</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>repackage</goal><!-- to make it exuteable with $ java -jar ./app.jar --> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/DbrepoSemanticsServiceApplication.java b/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/DbrepoSemanticsServiceApplication.java deleted file mode 100644 index bf0db3b8f8..0000000000 --- a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/DbrepoSemanticsServiceApplication.java +++ /dev/null @@ -1,25 +0,0 @@ -package at.tuwien; - -import org.apache.jena.sys.JenaSystem; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration; -import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; - -@EnableJpaAuditing -@EntityScan(basePackages = {"at.tuwien.entities"}) -@EnableElasticsearchRepositories(basePackages = {"at.tuwien.repository.sdb"}) -@EnableJpaRepositories(basePackages = {"at.tuwien.repository.mdb"}) -@SpringBootApplication(exclude = {ElasticsearchDataAutoConfiguration.class, ElasticsearchRestClientAutoConfiguration.class}) -public class DbrepoSemanticsServiceApplication { - - public static void main(String[] args) { - JenaSystem.init(); - SpringApplication.run(DbrepoSemanticsServiceApplication.class, args); - } - -} diff --git a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/config/SwaggerConfig.java b/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/config/SwaggerConfig.java deleted file mode 100644 index ce076d891f..0000000000 --- a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/config/SwaggerConfig.java +++ /dev/null @@ -1,54 +0,0 @@ -package at.tuwien.config; - -import io.swagger.v3.oas.models.ExternalDocumentation; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.servers.Server; -import org.springdoc.core.models.GroupedOpenApi; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.List; - -@Configuration -public class SwaggerConfig { - - @Value("${app.version:unknown}") - private String version; - - @Bean - public OpenAPI springShopOpenAPI() { - return new OpenAPI() - .info(new Info() - .title("Database Repository Semantic Service API") - .contact(new Contact() - .name("Prof. Andreas Rauber") - .email("andreas.rauber@tuwien.ac.at")) - .description("Service that manages the tables") - .version(version) - .license(new License() - .name("Apache 2.0") - .url("https://www.apache.org/licenses/LICENSE-2.0"))) - .externalDocs(new ExternalDocumentation() - .description("Sourcecode Documentation") - .url("https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services")) - .servers(List.of(new Server() - .description("Generated server url") - .url("http://localhost:9097"), - new Server() - .description("Sandbox") - .url("https://dbrepo2.tuwien.ac.at"))); - } - - @Bean - public GroupedOpenApi publicApi() { - return GroupedOpenApi.builder() - .group("semantics-service") - .pathsToMatch("/api/**") - .build(); - } - -} diff --git a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/OntologyEndpoint.java b/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/OntologyEndpoint.java deleted file mode 100644 index 36d60d66b3..0000000000 --- a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/OntologyEndpoint.java +++ /dev/null @@ -1,160 +0,0 @@ -package at.tuwien.endpoints; - -import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.api.semantics.*; -import at.tuwien.exception.OntologyNotFoundException; -import at.tuwien.exception.UserNotFoundException; -import at.tuwien.mapper.OntologyMapper; -import at.tuwien.service.OntologyService; -import io.micrometer.core.annotation.Timed; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; - -import java.security.Principal; -import java.util.List; - -@Log4j2 -@CrossOrigin(origins = "*") -@RestController -@RequestMapping("/api/semantic/ontology") -public class OntologyEndpoint { - - private final OntologyMapper ontologyMapper; - private final OntologyService ontologyService; - - @Autowired - public OntologyEndpoint(OntologyMapper ontologyMapper, OntologyService ontologyService) { - this.ontologyMapper = ontologyMapper; - this.ontologyService = ontologyService; - } - - @GetMapping - @Timed(value = "semantics.ontology.list", description = "Time needed to list ontologies") - @Operation(summary = "List all ontologies") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "List all ontologies", - content = {@Content( - mediaType = "application/json", - array = @ArraySchema(schema = @Schema(implementation = OntologyDto.class)))}), - }) - public ResponseEntity<List<OntologyBriefDto>> findAll() { - log.debug("endpoint find all ontologies"); - final List<OntologyBriefDto> dtos = ontologyService.findAll() - .stream() - .map(ontologyMapper::ontologyToOntologyBriefDto) - .toList(); - log.trace("create ontology resulted in dtos {}", dtos); - return ResponseEntity.ok(dtos); - } - - @GetMapping("/{id}") - @Timed(value = "semantics.ontology.find", description = "Time needed to find a specific ontology") - @Operation(summary = "Find one ontology") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "Find one ontology", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = OntologyDto.class))}), - @ApiResponse(responseCode = "404", - description = "Could not find ontology", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<OntologyDto> find(@NotNull @PathVariable("id") Long id) throws OntologyNotFoundException { - log.debug("endpoint find all ontologies, id={}", id); - final OntologyDto dto = ontologyMapper.ontologyToOntologyDto(ontologyService.find(id)); - log.trace("create ontology resulted in dto {}", dto); - return ResponseEntity.ok(dto); - } - - @PostMapping - @PreAuthorize("hasAuthority('create-ontology')") - @Timed(value = "semantics.ontology.create", description = "Time needed to register a new ontology") - @Operation(summary = "Register a new ontology", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "201", - description = "Registered ontology successfully", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = OntologyDto.class))}), - @ApiResponse(responseCode = "201", - description = "Could not find user", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<OntologyDto> create(@NotNull @Valid @RequestBody OntologyCreateDto data, - @NotNull Principal principal) throws UserNotFoundException { - log.debug("endpoint create ontology, data={}, principal={}", data, principal); - final OntologyDto dto = ontologyMapper.ontologyToOntologyDto(ontologyService.create(data, principal)); - log.trace("create ontology resulted in dto {}", dto); - return ResponseEntity.status(HttpStatus.CREATED) - .body(dto); - } - - @PutMapping("/{id}") - @PreAuthorize("hasAuthority('update-ontology')") - @Timed(value = "semantics.ontology.update", description = "Time needed to update a new ontology") - @Operation(summary = "Update an ontology", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Updated ontology successfully", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = OntologyDto.class))}), - @ApiResponse(responseCode = "404", - description = "Could not find ontology", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<OntologyDto> update(@NotNull @PathVariable("id") Long id, - @NotNull @Valid @RequestBody OntologyModifyDto data, - @NotNull Principal principal) throws OntologyNotFoundException { - log.debug("endpoint update ontology, data={}, principal={}", data, principal); - final OntologyDto dto = ontologyMapper.ontologyToOntologyDto(ontologyService.update(id, data)); - log.trace("update ontology resulted in dto {}", dto); - return ResponseEntity.accepted() - .body(dto); - } - - @DeleteMapping("/{id}") - @PreAuthorize("hasAuthority('delete-ontology')") - @Timed(value = "semantics.ontology.delete", description = "Time needed to delete an ontology") - @Operation(summary = "Delete an ontology", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Deleted ontology successfully", - content = {@Content( - mediaType = "application/json")}), - @ApiResponse(responseCode = "404", - description = "Could not find ontology", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<?> delete(@NotNull @PathVariable("id") Long id) throws OntologyNotFoundException { - log.debug("endpoint delete ontology, id={}", id); - ontologyService.delete(id); - return ResponseEntity.accepted() - .build(); - } - -} diff --git a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/QueryEndpoint.java b/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/QueryEndpoint.java deleted file mode 100644 index 159f8c1ece..0000000000 --- a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/QueryEndpoint.java +++ /dev/null @@ -1,103 +0,0 @@ -package at.tuwien.endpoints; - -import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.api.semantics.*; -import at.tuwien.entities.semantics.Ontology; -import at.tuwien.exception.FilterBadRequestException; -import at.tuwien.exception.OntologyNotFoundException; -import at.tuwien.exception.QueryMalformedException; -import at.tuwien.exception.UriMalformedException; -import at.tuwien.service.OntologyService; -import at.tuwien.service.QueryService; -import io.micrometer.core.annotation.Timed; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@Log4j2 -@CrossOrigin(origins = "*") -@RestController -@RequestMapping("/api/semantic") -public class QueryEndpoint { - - private final QueryService queryService; - private final OntologyService ontologyService; - - @Autowired - public QueryEndpoint(QueryService queryService, OntologyService ontologyService) { - this.queryService = queryService; - this.ontologyService = ontologyService; - } - - @GetMapping("/ontology/{id}/entity") - @PreAuthorize("hasAuthority('execute-semantic-query')") - @Timed(value = "semantics.find", description = "Time needed to find entities") - @Operation(summary = "Find entities", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "Found entities", - content = {@Content( - mediaType = "application/json", - array = @ArraySchema(schema = @Schema(implementation = EntityDto.class)))}), - @ApiResponse(responseCode = "400", - description = "Filter params are invalid", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "404", - description = "Could not find ontology", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "417", - description = "Generated query or uri is malformed", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<List<EntityDto>> find(@NotNull @PathVariable("id") Long id, - @RequestParam(name = "label", required = false) String label, - @RequestParam(name = "uri", required = false) String uri) - throws OntologyNotFoundException, QueryMalformedException, UriMalformedException, FilterBadRequestException { - log.debug("endpoint find entities by uri, id={}, label={}, uri={}", id, label, uri); - final Ontology ontology = ontologyService.find(id); - /* check */ - if ((label != null && uri != null) || (label == null && uri == null)) { - log.error("Failed to find entities: either label or uri must be defined"); - throw new FilterBadRequestException("Failed to find entities: either label or uri must be defined"); - } - if (uri != null && !uri.startsWith(ontology.getUri())) { - log.error("Failed to find entities: uri {} does not start with expected ontology uri {}", uri, ontology.getUri()); - throw new UriMalformedException("Failed to find entity: uri " + uri + " does not start with expected ontology uri " + ontology.getUri()); - } - if (ontology.getSparqlEndpoint() == null) { - log.error("Failed to find SPARQL endpoint for ontology with id {}", ontology.getId()); - throw new OntologyNotFoundException("Failed to find SPARQL endpoint for ontology with id " + ontology.getId()); - } - /* get */ - final List<EntityDto> dtos; - if (uri != null) { - dtos = queryService.findByUri(ontology, uri); - log.trace("find entities resulted in dtos {}", dtos); - return ResponseEntity.ok() - .body(dtos); - } - dtos = queryService.findByLabel(ontology, label); - log.trace("find entities resulted in dtos {}", dtos); - return ResponseEntity.ok() - .body(dtos); - } - -} diff --git a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/SemanticsEndpoint.java b/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/SemanticsEndpoint.java deleted file mode 100644 index ce2f64c638..0000000000 --- a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/SemanticsEndpoint.java +++ /dev/null @@ -1,128 +0,0 @@ -package at.tuwien.endpoints; - -import at.tuwien.api.database.table.columns.concepts.*; -import at.tuwien.mapper.OntologyMapper; -import at.tuwien.mapper.SemanticMapper; -import at.tuwien.service.SemanticService; -import io.micrometer.core.annotation.Timed; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@Log4j2 -@CrossOrigin(origins = "*") -@RestController -@RequestMapping("/api/semantic") -public class SemanticsEndpoint { - - private final SemanticMapper semanticMapper; - private final OntologyMapper ontologyMapper; - private final SemanticService semanticService; - - @Autowired - public SemanticsEndpoint(SemanticMapper semanticMapper, OntologyMapper ontologyMapper, SemanticService semanticService) { - this.semanticMapper = semanticMapper; - this.ontologyMapper = ontologyMapper; - this.semanticService = semanticService; - } - - @GetMapping("/concept") - @Transactional(readOnly = true) - @Timed(value = "semantics.concept.list", description = "Time needed to find all semantic concepts") - @Operation(summary = "List semantic concepts") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "Find all semantic concepts", - content = {@Content( - mediaType = "application/json", - array = @ArraySchema(schema = @Schema(implementation = ConceptDto.class)))}), - }) - public ResponseEntity<List<ConceptDto>> findAllConcepts() { - log.debug("endpoint list concepts"); - final List<ConceptDto> dtos = semanticService.findAllConcepts() - .stream() - .map(semanticMapper::tableColumnConceptToConceptDto) - .toList(); - log.trace("Find all concepts resulted in dtos {}", dtos); - return ResponseEntity.ok() - .body(dtos); - } - - @PostMapping("/concept") - @Transactional - @PreAuthorize("hasAuthority('create-semantic-concept')") - @Timed(value = "semantics.concept.save", description = "Time needed to save a semantic concept") - @Operation(summary = "Create or update a semantic concept", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Saved a semantic concept", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ConceptDto.class))}), - }) - public ResponseEntity<ConceptDto> saveUnit(@NotNull @Valid @RequestBody ConceptSaveDto data) { - log.debug("endpoint save concept, data={}", data); - final ConceptDto dto = ontologyMapper.tableColumnConceptToConceptDto(semanticService.saveConcept(data)); - log.trace("save concept resulted in dto {}", dto); - return ResponseEntity.accepted() - .body(dto); - } - - @GetMapping("/unit") - @Transactional(readOnly = true) - @Timed(value = "semantics.concept.list", description = "Time needed to find all semantic units") - @Operation(summary = "List semantic units") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "Find all semantic units", - content = {@Content( - mediaType = "application/json", - array = @ArraySchema(schema = @Schema(implementation = UnitDto.class)))}), - }) - public ResponseEntity<List<UnitDto>> findAllUnits() { - log.debug("endpoint list units"); - final List<UnitDto> dtos = semanticService.findAllUnits() - .stream() - .map(semanticMapper::tableColumnUnitToUnitDto) - .toList(); - log.trace("Find all units resulted in dtos {}", dtos); - return ResponseEntity.ok() - .body(dtos); - } - - @PostMapping("/unit") - @Transactional - @PreAuthorize("hasAuthority('create-semantic-unit')") - @Timed(value = "semantics.unit.save", description = "Time needed to save a semantic unit") - @Operation(summary = "Save a semantic unit", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Saved a semantic unit", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = UnitDto.class))}), - }) - public ResponseEntity<UnitDto> saveUnit(@NotNull @Valid @RequestBody UnitSaveDto data) { - log.debug("endpoint save or update unit, data={}", data); - final UnitDto dto = ontologyMapper.tableColumnUnitToUnitDto(semanticService.saveUnit(data)); - log.trace("save unit resulted in dto {}", dto); - return ResponseEntity.accepted() - .body(dto); - } - -} diff --git a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java deleted file mode 100644 index 3ce65ac451..0000000000 --- a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java +++ /dev/null @@ -1,106 +0,0 @@ -package at.tuwien.endpoints; - -import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.api.semantics.EntityDto; -import at.tuwien.api.semantics.TableColumnEntityDto; -import at.tuwien.exception.QueryMalformedException; -import at.tuwien.exception.TableColumnNotFoundException; -import at.tuwien.exception.TableNotFoundException; -import at.tuwien.service.TableService; -import io.micrometer.core.annotation.Timed; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@Log4j2 -@CrossOrigin(origins = "*") -@RestController -@RequestMapping("/api/semantic/database/{databaseId}/table/{tableId}") -public class TableEndpoint { - - private final TableService tableService; - - @Autowired - public TableEndpoint(TableService tableService) { - this.tableService = tableService; - } - - @GetMapping - @Transactional(readOnly = true) - @PreAuthorize("hasAuthority('table-semantic-analyse')") - @Timed(value = "semantics.table.analyse", description = "Time needed to analyse table semantics") - @Operation(summary = "Suggest table semantics", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "Suggested table semantics successfully", - content = {@Content( - mediaType = "application/json", - array = @ArraySchema(schema = @Schema(implementation = TableColumnEntityDto.class)))}), - @ApiResponse(responseCode = "404", - description = "Could not find the table", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "417", - description = "Generated query is malformed", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<List<EntityDto>> analyseTable(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @PathVariable("tableId") Long tableId) - throws TableNotFoundException, QueryMalformedException { - log.debug("endpoint analyse table semantics, databaseId={}, tableId={}", databaseId, tableId); - final List<EntityDto> dtos = tableService.suggestTableSemantics(databaseId, tableId); - log.trace("analyse table semantics resulted in dtos {}", dtos); - return ResponseEntity.ok() - .body(dtos); - } - - @GetMapping("/column/{columnId}") - @Transactional(readOnly = true) - @PreAuthorize("hasAuthority('table-semantic-analyse')") - @Timed(value = "semantics.table.columnanalyse", description = "Time needed to analyse table column semantics") - @Operation(summary = "Suggest table column semantics", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "Suggested table column semantics successfully", - content = {@Content( - mediaType = "application/json", - array = @ArraySchema(schema = @Schema(implementation = TableColumnEntityDto.class)))}), - @ApiResponse(responseCode = "404", - description = "Could not find the table column", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "417", - description = "Generated query is malformed", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<List<TableColumnEntityDto>> analyseTableColumn(@NotNull @PathVariable("databaseId") Long databaseId, - @NotNull @PathVariable("tableId") Long tableId, - @NotNull @PathVariable("columnId") Long columnId) - throws QueryMalformedException, TableColumnNotFoundException { - log.debug("endpoint analyse table column semantics, databaseId={}, tableId={}, columnId={}", databaseId, tableId, columnId); - final List<TableColumnEntityDto> dtos = tableService.suggestTableColumnSemantics(databaseId, tableId, columnId); - log.trace("analyse table semantics resulted in dtos {}", dtos); - return ResponseEntity.ok() - .body(dtos); - } - -} diff --git a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java b/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java deleted file mode 100644 index 92c33e77bc..0000000000 --- a/dbrepo-semantics-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java +++ /dev/null @@ -1,78 +0,0 @@ -package at.tuwien.handlers; - -import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.exception.*; -import io.swagger.v3.oas.annotations.Hidden; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.context.request.WebRequest; -import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; - -@ControllerAdvice -public class ApiExceptionHandler extends ResponseEntityExceptionHandler { - - @Hidden - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler({FilterBadRequestException.class}) - public ResponseEntity<ApiErrorDto> handle(FilterBadRequestException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.BAD_REQUEST) - .message(e.getLocalizedMessage()) - .code("error.semantic.filter") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler({OntologyNotFoundException.class}) - public ResponseEntity<ApiErrorDto> handle(OntologyNotFoundException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.NOT_FOUND) - .message(e.getLocalizedMessage()) - .code("error.ontology.notfound") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.EXPECTATION_FAILED) - @ExceptionHandler({QueryMalformedException.class}) - public ResponseEntity<ApiErrorDto> handle(QueryMalformedException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.EXPECTATION_FAILED) - .message(e.getLocalizedMessage()) - .code("error.semantic.querymalformed") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler({TableNotFoundException.class}) - public ResponseEntity<ApiErrorDto> handle(TableNotFoundException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.NOT_FOUND) - .message(e.getLocalizedMessage()) - .code("error.table.notfound") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.EXPECTATION_FAILED) - @ExceptionHandler({UriMalformedException.class}) - public ResponseEntity<ApiErrorDto> handle(UriMalformedException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.EXPECTATION_FAILED) - .message(e.getLocalizedMessage()) - .code("error.semantic.urimalformed") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - -} diff --git a/dbrepo-semantics-service/rest-service/src/main/resources/application-local.yml b/dbrepo-semantics-service/rest-service/src/main/resources/application-local.yml deleted file mode 100644 index e4b8076f7b..0000000000 --- a/dbrepo-semantics-service/rest-service/src/main/resources/application-local.yml +++ /dev/null @@ -1,55 +0,0 @@ -app.version: '@project.version@' -spring: - main.banner-mode: off - datasource: - url: jdbc:mariadb://localhost:3306/fda - driver-class-name: org.mariadb.jdbc.Driver - username: root - password: dbrepo - jpa: - show-sql: false - database-platform: org.hibernate.dialect.MariaDBDialect - hibernate: - search: - default: - elasticsearch: - host: search-db - ddl-auto: validate - use-new-id-generator-mappings: false - open-in-view: false - properties: - hibernate: - default_schema: fda - jdbc: - time_zone: UTC - application: - name: semantics-service - rabbitmq: - host: localhost - virtual-host: dbrepo - username: fda - password: fda - opensearch: - username: admin - password: admin - host: search-db - port: 9200 - protocol: http - cloud: - loadbalancer.ribbon.enabled: false -management.endpoints.web.exposure.include: health,info,prometheus -server: - port: 9097 -logging: - pattern.console: "%d %highlight(%-5level) %msg%n" - level: - root: warn - at.tuwien.: trace - org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -fda: - jwt: - issuer: http://localhost/realms/dbrepo - public_key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB - client_secret: client-secret - client_id: dbrepo-client - gateway.endpoint: http://localhost \ No newline at end of file diff --git a/dbrepo-semantics-service/rest-service/src/main/resources/application.yml b/dbrepo-semantics-service/rest-service/src/main/resources/application.yml deleted file mode 100644 index 0e7a2d5556..0000000000 --- a/dbrepo-semantics-service/rest-service/src/main/resources/application.yml +++ /dev/null @@ -1,70 +0,0 @@ -app.version: '@project.version@' -spring: - main.banner-mode: off - autoconfigure: - exclude: org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration - datasource: - url: "jdbc:mariadb://metadata-db:3306/${METADATA_DB}" - driver-class-name: org.mariadb.jdbc.Driver - username: "${METADATA_USERNAME}" - password: "${METADATA_PASSWORD}" - jpa: - show-sql: false - database-platform: org.hibernate.dialect.MariaDBDialect - hibernate: - search: - default: - elasticsearch: - host: search-db - ddl-auto: validate - use-new-id-generator-mappings: false - open-in-view: false - properties: - hibernate: - default_schema: "${METADATA_DB}" - jdbc: - time_zone: UTC - application: - name: semantics-service - rabbitmq: - host: broker-service - virtual-host: dbrepo - username: "${BROKER_USERNAME}" - password: "${BROKER_PASSWORD}" - opensearch: - username: "${SEARCH_USERNAME}" - password: "${SEARCH_PASSWORD}" - host: search-db - port: 9200 - protocol: http - cloud: - loadbalancer.ribbon.enabled: false -management: - endpoints: - web: - exposure: - include: health,info,prometheus - endpoint: - health: - probes: - enabled: true - health: - readinessState: - enabled: true - livenessState: - enabled: true -server: - port: 9097 -logging: - pattern.console: "%d %highlight(%-5level) %msg%n" - level: - root: warn - at.tuwien.: "${LOG_LEVEL}" - org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -fda: - jwt: - issuer: "${JWT_ISSUER}" - public_key: "${JWT_PUBKEY}" - client_secret: "${DBREPO_CLIENT_SECRET}" - client_id: "${CLIENT_ID}" - gateway.endpoint: http://gateway-service \ No newline at end of file diff --git a/dbrepo-semantics-service/rest-service/src/main/resources/config.properties b/dbrepo-semantics-service/rest-service/src/main/resources/config.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-semantics-service/rest-service/src/main/resources/mariadb_hibernate.cfg.xml b/dbrepo-semantics-service/rest-service/src/main/resources/mariadb_hibernate.cfg.xml deleted file mode 100644 index 5d1f8bd44e..0000000000 --- a/dbrepo-semantics-service/rest-service/src/main/resources/mariadb_hibernate.cfg.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE hibernate-configuration PUBLIC - "-//Hibernate/Hibernate Configuration DTD 3.0//EN" - "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> -<hibernate-configuration> - <session-factory> - <property name="current_session_context_class">thread</property> - <property name="transaction.coordinator_class">jdbc</property> - <property name="c3p0.min_size">5</property> - <property name="c3p0.max_size">30</property> - <property name="c3p0.acquire_increment">5</property> - <property name="c3p0.timeout">1800</property> - <property name="show_sql">true</property> - <property name="format_sql">true</property> - <property name="hbm2ddl.auto">update</property> - <mapping class="at.tuwien.querystore.Query" /> - <mapping class="at.tuwien.querystore.Table" /> - <mapping class="at.tuwien.querystore.Column" /> - </session-factory> -</hibernate-configuration> diff --git a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java b/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java deleted file mode 100644 index 01f84e12b9..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien; - -import at.tuwien.test.BaseTest; -import org.springframework.test.context.TestPropertySource; - -@TestPropertySource(locations = "classpath:application.properties") -public abstract class BaseUnitTest extends BaseTest { - -} diff --git a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/ActuatorComponentTest.java b/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/ActuatorComponentTest.java deleted file mode 100644 index a1530c6279..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/ActuatorComponentTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.repository.sdb.*; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@Log4j2 -@ExtendWith(SpringExtension.class) -@AutoConfigureMockMvc -@SpringBootTest -public class ActuatorComponentTest extends BaseUnitTest { - - @MockBean - private UnitIdxRepository unitIdxRepository; - - @MockBean - private ConceptIdxRepository conceptIdxRepository; - - @Autowired - private MockMvc mockMvc; - - @Test - public void actuatorInfo_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/info")) - .andDo(print()) - .andExpect(status().isOk()); - } - - @Test - public void actuatorStatus_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/health")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.status").value("UP")); - } - - @Test - public void actuatorLiveness_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/health/liveness")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.status").value("UP")); - } - - @Test - public void actuatorReadiness_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/health/readiness")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.status").value("UP")); - } - - @Test - public void actuatorPrometheus_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/prometheus")); - } - -} diff --git a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/OntologyEndpointUnitTest.java b/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/OntologyEndpointUnitTest.java deleted file mode 100644 index ba2485698e..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/OntologyEndpointUnitTest.java +++ /dev/null @@ -1,312 +0,0 @@ - -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.semantics.OntologyBriefDto; -import at.tuwien.api.semantics.OntologyCreateDto; -import at.tuwien.api.semantics.OntologyDto; -import at.tuwien.api.semantics.OntologyModifyDto; -import at.tuwien.endpoints.OntologyEndpoint; -import at.tuwien.entities.semantics.Ontology; -import at.tuwien.entities.user.User; -import at.tuwien.exception.OntologyNotFoundException; -import at.tuwien.exception.UserNotFoundException; -import at.tuwien.repository.sdb.*; -import at.tuwien.service.OntologyService; -import at.tuwien.service.UserService; -import lombok.extern.log4j.Log4j2; -import org.apache.jena.sys.JenaSystem; -import org.hibernate.HibernateException; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.test.context.support.WithAnonymousUser; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.security.Principal; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -@Log4j2 -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class OntologyEndpointUnitTest extends BaseUnitTest { - - @MockBean - private OntologyService ontologyService; - - @MockBean - private UserService userService; - - @MockBean - private UnitIdxRepository unitIdxRepository; - - @MockBean - private ConceptIdxRepository conceptIdxRepository; - - @Autowired - private OntologyEndpoint ontologyEndpoint; - - @BeforeAll - public static void beforeAll() { - JenaSystem.init(); - } - - @Test - @WithAnonymousUser - public void findAll_anonymous_succeeds() { - - /* test */ - findAll_generic(); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void findAll_noRole_succeeds() { - - /* test */ - findAll_generic(); - } - - @Test - @WithAnonymousUser - public void find_anonymous_succeeds() throws OntologyNotFoundException { - - /* test */ - find_generic(ONTOLOGY_1_ID, ONTOLOGY_1); - } - - @Test - @WithAnonymousUser - public void find_notFound_fails() { - - /* test */ - assertThrows(OntologyNotFoundException.class, () -> { - find_generic(99999L, null); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void find_noRole_succeeds() throws OntologyNotFoundException { - - /* test */ - find_generic(ONTOLOGY_1_ID, ONTOLOGY_1); - } - - @Test - @WithAnonymousUser - public void create_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - create_generic(ONTOLOGY_1_CREATE_DTO, null, null, null, ONTOLOGY_1); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void create_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - create_generic(ONTOLOGY_1_CREATE_DTO, USER_4_PRINCIPAL, USER_4_USERNAME, USER_4, ONTOLOGY_1); - }); - } - - @Test - @WithMockUser(username = USER_3_USERNAME, authorities = {"create-ontology"}) - public void create_hasRole_succeeds() throws UserNotFoundException { - - /* test */ - create_generic(ONTOLOGY_1_CREATE_DTO, USER_3_PRINCIPAL, USER_3_USERNAME, USER_3, ONTOLOGY_1); - } - - @Test - @WithAnonymousUser - public void update_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - update_generic(ONTOLOGY_1_ID, ONTOLOGY_1_MODIFY_DTO, null, ONTOLOGY_1); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void update_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - update_generic(ONTOLOGY_1_ID, ONTOLOGY_1_MODIFY_DTO, USER_4_PRINCIPAL, ONTOLOGY_1); - }); - } - - @Test - @WithMockUser(username = USER_3_USERNAME, authorities = {"update-ontology"}) - public void update_hasRoleNotFound_fails() { - - /* test */ - assertThrows(OntologyNotFoundException.class, () -> { - update_generic(ONTOLOGY_1_ID, ONTOLOGY_1_MODIFY_DTO, USER_3_PRINCIPAL, null); - }); - } - - @Test - @WithMockUser(username = USER_3_USERNAME, authorities = {"update-ontology"}) - public void update_hasRole_succeeds() throws OntologyNotFoundException { - - /* test */ - update_generic(ONTOLOGY_1_ID, ONTOLOGY_1_MODIFY_DTO, USER_3_PRINCIPAL, ONTOLOGY_1); - } - - @Test - @WithAnonymousUser - public void delete_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - delete_generic(ONTOLOGY_1_ID, ONTOLOGY_1); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void delete_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - delete_generic(ONTOLOGY_1_ID, ONTOLOGY_1); - }); - } - - @Test - @WithMockUser(username = USER_3_USERNAME, authorities = {"delete-ontology"}) - public void delete_hasRoleNotFound_fails() { - - /* test */ - assertThrows(OntologyNotFoundException.class, () -> { - delete_generic(ONTOLOGY_1_ID, null); - }); - } - - @Test - @WithMockUser(username = USER_3_USERNAME, authorities = {"delete-ontology"}) - public void delete_hasRole_succeeds() throws OntologyNotFoundException { - - /* test */ - delete_generic(ONTOLOGY_1_ID, ONTOLOGY_1); - } - - /* ################################################################################################### */ - /* ## GENERIC TEST CASES ## */ - /* ################################################################################################### */ - - public void findAll_generic() { - - /* mock */ - when(ontologyService.findAll()) - .thenReturn(List.of(ONTOLOGY_1, ONTOLOGY_2, ONTOLOGY_3, ONTOLOGY_4)); - - /* test */ - final ResponseEntity<List<OntologyBriefDto>> response = ontologyEndpoint.findAll(); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final List<OntologyBriefDto> body = response.getBody(); - assertNotNull(body); - assertEquals(4, body.size()); - } - - public void find_generic(Long ontologyId, Ontology ontology) throws OntologyNotFoundException { - - /* mock */ - if (ontology != null) { - when(ontologyService.find(ontologyId)) - .thenReturn(ontology); - } else { - doThrow(OntologyNotFoundException.class) - .when(ontologyService) - .find(ontologyId); - } - - /* test */ - final ResponseEntity<OntologyDto> response = ontologyEndpoint.find(ontologyId); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final OntologyDto body = response.getBody(); - assertNotNull(body); - } - - public void create_generic(OntologyCreateDto createDto, Principal principal, String username, User user, Ontology ontology) - throws UserNotFoundException { - - /* mock */ - if (ontology != null) { - when(ontologyService.create(createDto, principal)) - .thenReturn(ontology); - } else { - doThrow(HibernateException.class) - .when(ontologyService) - .create(createDto, principal); - } - if (user != null) { - when(userService.findByUsername(username)) - .thenReturn(user); - } else { - doThrow(UserNotFoundException.class) - .when(userService) - .findByUsername(username); - } - - /* test */ - final ResponseEntity<OntologyDto> response = ontologyEndpoint.create(createDto, principal); - assertEquals(HttpStatus.CREATED, response.getStatusCode()); - final OntologyDto body = response.getBody(); - assertNotNull(body); - } - - public void update_generic(Long ontologyId, OntologyModifyDto modifyDto, Principal principal, Ontology ontology) - throws OntologyNotFoundException { - - /* mock */ - if (ontology != null) { - when(ontologyService.update(ontologyId, modifyDto)) - .thenReturn(ontology); - } else { - doThrow(OntologyNotFoundException.class) - .when(ontologyService) - .update(ontologyId, modifyDto); - } - - /* test */ - final ResponseEntity<OntologyDto> response = ontologyEndpoint.update(ontologyId, modifyDto, principal); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - final OntologyDto body = response.getBody(); - assertNotNull(body); - } - - public void delete_generic(Long ontologyId, Ontology ontology) throws OntologyNotFoundException { - - /* mock */ - if (ontology != null) { - doNothing() - .when(ontologyService) - .delete(ontologyId); - } else { - doThrow(OntologyNotFoundException.class) - .when(ontologyService) - .delete(ontologyId); - } - - /* test */ - final ResponseEntity<?> response = ontologyEndpoint.delete(ontologyId); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - } -} diff --git a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/QueryEndpointUnitTest.java b/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/QueryEndpointUnitTest.java deleted file mode 100644 index 5d6523bd7d..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/QueryEndpointUnitTest.java +++ /dev/null @@ -1,167 +0,0 @@ - -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.semantics.*; -import at.tuwien.endpoints.QueryEndpoint; -import at.tuwien.entities.semantics.Ontology; -import at.tuwien.exception.FilterBadRequestException; -import at.tuwien.exception.OntologyNotFoundException; -import at.tuwien.exception.QueryMalformedException; -import at.tuwien.exception.UriMalformedException; -import at.tuwien.repository.sdb.*; -import at.tuwien.service.OntologyService; -import at.tuwien.service.QueryService; -import lombok.extern.log4j.Log4j2; -import org.apache.jena.sys.JenaSystem; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.test.context.support.WithAnonymousUser; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -@Log4j2 -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class QueryEndpointUnitTest extends BaseUnitTest { - - @MockBean - private QueryService queryService; - - @MockBean - private OntologyService ontologyService; - - @MockBean - private UnitIdxRepository unitIdxRepository; - - @MockBean - private ConceptIdxRepository conceptIdxRepository; - - @Autowired - private QueryEndpoint queryEndpoint; - - @BeforeAll - public static void beforeAll() { - JenaSystem.init(); - } - - @Test - @WithAnonymousUser - public void find_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - find_generic(ONTOLOGY_2_ID, "Apache Jena", null, ONTOLOGY_2, null); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME, authorities = {}) - public void find_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - find_generic(ONTOLOGY_2_ID, "Apache Jena", null, ONTOLOGY_2, null); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-semantic-query"}) - public void find_hasRoleInvalidParams_succeeds() { - - /* test */ - assertThrows(FilterBadRequestException.class, () -> { - find_generic(ONTOLOGY_2_ID, "Apache Jena", "http://www.wikidata.org/entity/Q1686799", ONTOLOGY_2, null); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-semantic-query"}) - public void find_hasRoleNotOntologyUri_succeeds() { - - /* test */ - assertThrows(UriMalformedException.class, () -> { - find_generic(ONTOLOGY_2_ID, null, "https://wikidata.org/entity/Q1686799", ONTOLOGY_2, null); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-semantic-query"}) - public void find_hasRoleLabel_succeeds() throws UriMalformedException, QueryMalformedException, - OntologyNotFoundException, FilterBadRequestException { - final EntityDto entityDto = EntityDto.builder() - .label("Apache Jena") - .uri("http://www.wikidata.org/entity/Q1686799") - .build(); - - /* test */ - final List<EntityDto> response = find_generic(ONTOLOGY_2_ID, "Apache Jena", null, ONTOLOGY_2, entityDto); - final EntityDto entity0 = response.get(0); - assertEquals("Apache Jena", entity0.getLabel()); - assertEquals("http://www.wikidata.org/entity/Q1686799", entity0.getUri()); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-semantic-query"}) - public void find_hasRoleUri_succeeds() throws UriMalformedException, QueryMalformedException, - OntologyNotFoundException, FilterBadRequestException { - final EntityDto entityDto = EntityDto.builder() - .label("Apache Jena") - .uri("http://www.wikidata.org/entity/Q1686799") - .build(); - - /* test */ - final List<EntityDto> response = find_generic(ONTOLOGY_2_ID, null, "http://www.wikidata.org/entity/Q1686799", ONTOLOGY_2, entityDto); - final EntityDto entity0 = response.get(0); - assertEquals("Apache Jena", entity0.getLabel()); - assertEquals("http://www.wikidata.org/entity/Q1686799", entity0.getUri()); - } - - /* ################################################################################################### */ - /* ## GENERIC TEST CASES ## */ - /* ################################################################################################### */ - - public List<EntityDto> find_generic(Long ontologyId, String label, String uri, Ontology ontology, EntityDto entityDto) - throws OntologyNotFoundException, QueryMalformedException, UriMalformedException, FilterBadRequestException { - - /* mock */ - if (ontology != null) { - when(ontologyService.find(ontologyId)) - .thenReturn(ontology); - } else { - doThrow(OntologyNotFoundException.class) - .when(ontologyService) - .find(ontologyId); - } - if (entityDto != null) { - when(queryService.findByLabel(ontology, label)) - .thenReturn(List.of(entityDto)); - when(queryService.findByUri(ontology, uri)) - .thenReturn(List.of(entityDto)); - } else { - when(queryService.findByLabel(ontology, label)) - .thenReturn(List.of()); - when(queryService.findByUri(ontology, uri)) - .thenReturn(List.of()); - } - - /* test */ - final ResponseEntity<List<EntityDto>> response = queryEndpoint.find(ontologyId, label, uri); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final List<EntityDto> body = response.getBody(); - assertNotNull(body); - return body; - } -} diff --git a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/SemanticsEndpointUnitTest.java b/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/SemanticsEndpointUnitTest.java deleted file mode 100644 index d98245334f..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/SemanticsEndpointUnitTest.java +++ /dev/null @@ -1,215 +0,0 @@ - -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.database.table.columns.concepts.ConceptDto; -import at.tuwien.api.database.table.columns.concepts.ConceptSaveDto; -import at.tuwien.api.database.table.columns.concepts.UnitDto; -import at.tuwien.api.database.table.columns.concepts.UnitSaveDto; -import at.tuwien.endpoints.SemanticsEndpoint; -import at.tuwien.entities.database.table.columns.TableColumnConcept; -import at.tuwien.entities.database.table.columns.TableColumnUnit; -import at.tuwien.repository.sdb.*; -import at.tuwien.service.SemanticService; -import lombok.extern.log4j.Log4j2; -import org.apache.jena.sys.JenaSystem; -import org.hibernate.HibernateException; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.test.context.support.WithAnonymousUser; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.when; - -@Log4j2 -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class SemanticsEndpointUnitTest extends BaseUnitTest { - - @MockBean - private SemanticService semanticService; - - @MockBean - private UnitIdxRepository unitIdxRepository; - - @MockBean - private ConceptIdxRepository conceptIdxRepository; - - @Autowired - private SemanticsEndpoint semanticsEndpoint; - - @BeforeAll - public static void beforeAll() { - JenaSystem.init(); - } - - @Test - @WithAnonymousUser - public void findAllConcepts_anonymous_succeeds() { - - /* test */ - findAllConcepts_generic(); - } - - @Test - @WithMockUser(username = USER_4_USERNAME, authorities = {}) - public void findAllConcepts_noRole_succeeds() { - - /* test */ - findAllConcepts_generic(); - } - - @Test - @WithAnonymousUser - public void findAllUnits_anonymous_succeeds() { - - /* test */ - findAllUnits_generic(); - } - - @Test - @WithMockUser(username = USER_4_USERNAME, authorities = {}) - public void findAllUnits_noRole_succeeds() { - - /* test */ - findAllUnits_generic(); - } - - @Test - @WithAnonymousUser - public void saveConcept_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - saveConcept_generic(COLUMN_CONCEPT_TEMPERATURE_SAVE_DTO, COLUMN_CONCEPT_TEMPERATURE); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME, authorities = {}) - public void saveConcept_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - saveConcept_generic(COLUMN_CONCEPT_TEMPERATURE_SAVE_DTO, COLUMN_CONCEPT_TEMPERATURE); - }); - } - - @Test - @WithMockUser(username = USER_3_USERNAME, authorities = {"create-semantic-concept"}) - public void saveConcept_hasRole_succeeds() { - - /* test */ - saveConcept_generic(COLUMN_CONCEPT_TEMPERATURE_SAVE_DTO, COLUMN_CONCEPT_TEMPERATURE); - } - - @Test - @WithAnonymousUser - public void saveUnit_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - saveUnit_generic(UNIT_1_SAVE_DTO, UNIT_1); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME, authorities = {}) - public void saveUnit_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - saveUnit_generic(UNIT_1_SAVE_DTO, UNIT_1); - }); - } - - @Test - @WithMockUser(username = USER_3_USERNAME, authorities = {"create-semantic-unit"}) - public void saveUnit_hasRole_succeeds() { - - /* test */ - saveUnit_generic(UNIT_1_SAVE_DTO, UNIT_1); - } - - /* ################################################################################################### */ - /* ## GENERIC TEST CASES ## */ - /* ################################################################################################### */ - - public void findAllConcepts_generic() { - - /* mock */ - when(semanticService.findAllConcepts()) - .thenReturn(List.of(COLUMN_CONCEPT_TEMPERATURE, COLUMN_CONCEPT_FAIR_DATA)); - - /* test */ - final ResponseEntity<List<ConceptDto>> response = semanticsEndpoint.findAllConcepts(); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final List<ConceptDto> body = response.getBody(); - assertNotNull(body); - assertEquals(2, body.size()); - } - - public void findAllUnits_generic() { - - /* mock */ - when(semanticService.findAllUnits()) - .thenReturn(List.of(UNIT_2, UNIT_1)); - - /* test */ - final ResponseEntity<List<UnitDto>> response = semanticsEndpoint.findAllUnits(); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final List<UnitDto> body = response.getBody(); - assertNotNull(body); - assertEquals(2, body.size()); - } - - public void saveConcept_generic(ConceptSaveDto saveDto, TableColumnConcept concept) { - - /* mock */ - if (concept != null) { - when(semanticService.saveConcept(saveDto)) - .thenReturn(concept); - } else { - doThrow(HibernateException.class) - .when(semanticService) - .saveConcept(saveDto); - } - - /* test */ - final ResponseEntity<ConceptDto> response = semanticsEndpoint.saveUnit(saveDto); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - final ConceptDto body = response.getBody(); - assertNotNull(body); - } - - public void saveUnit_generic(UnitSaveDto saveDto, TableColumnUnit unit) { - - /* mock */ - if (unit != null) { - when(semanticService.saveUnit(saveDto)) - .thenReturn(unit); - } else { - doThrow(HibernateException.class) - .when(semanticService) - .saveUnit(saveDto); - } - - /* test */ - final ResponseEntity<UnitDto> response = semanticsEndpoint.saveUnit(saveDto); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - final UnitDto body = response.getBody(); - assertNotNull(body); - } -} diff --git a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/SwaggerComponentTest.java b/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/SwaggerComponentTest.java deleted file mode 100644 index e55d5ef87e..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/SwaggerComponentTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.repository.sdb.*; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@Log4j2 -@ExtendWith(SpringExtension.class) -@AutoConfigureMockMvc -@SpringBootTest -public class SwaggerComponentTest extends BaseUnitTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private UnitIdxRepository unitIdxRepository; - - @MockBean - private ConceptIdxRepository conceptIdxRepository; - - @Test - public void swaggerUi_succeeds() throws Exception { - this.mockMvc.perform(get("/swagger-ui/index.html")) - .andDo(print()) - .andExpect(status().isOk()); - } - -} diff --git a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java b/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java deleted file mode 100644 index 50a6b5e631..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java +++ /dev/null @@ -1,140 +0,0 @@ - -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.semantics.*; -import at.tuwien.endpoints.TableEndpoint; -import at.tuwien.exception.QueryMalformedException; -import at.tuwien.exception.TableColumnNotFoundException; -import at.tuwien.exception.TableNotFoundException; -import at.tuwien.repository.sdb.*; -import at.tuwien.service.TableService; -import lombok.extern.log4j.Log4j2; -import org.apache.jena.sys.JenaSystem; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.test.context.support.WithAnonymousUser; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -@Log4j2 -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class TableEndpointUnitTest extends BaseUnitTest { - - @MockBean - private TableService tableService; - - @MockBean - private UnitIdxRepository unitIdxRepository; - - @MockBean - private ConceptIdxRepository conceptIdxRepository; - - @Autowired - private TableEndpoint tableEndpoint; - - @BeforeAll - public static void beforeAll() { - JenaSystem.init(); - } - - @Test - @WithAnonymousUser - public void analyseTable_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - analyseTable_generic(DATABASE_1_ID, TABLE_1_ID); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void findAll_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - analyseTable_generic(DATABASE_1_ID, TABLE_1_ID); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"table-semantic-analyse"}) - public void findAll_hasRole_succeeds() throws TableNotFoundException, QueryMalformedException { - - /* test */ - analyseTable_generic(DATABASE_1_ID, TABLE_1_ID); - } - - @Test - @WithAnonymousUser - public void analyseTableColumn_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - analyseTableColumn_generic(DATABASE_1_ID, TABLE_1_ID, COLUMN_1_1_ID); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void analyseTableColumn_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - analyseTableColumn_generic(DATABASE_1_ID, TABLE_1_ID, COLUMN_1_1_ID); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"table-semantic-analyse"}) - public void analyseTableColumn_hasRole_succeeds() throws QueryMalformedException, TableColumnNotFoundException { - - /* test */ - analyseTableColumn_generic(DATABASE_1_ID, TABLE_1_ID, COLUMN_1_1_ID); - } - - /* ################################################################################################### */ - /* ## GENERIC TEST CASES ## */ - /* ################################################################################################### */ - - public void analyseTable_generic(Long databaseId, Long tableId) throws TableNotFoundException, QueryMalformedException { - - /* mock */ - when(tableService.suggestTableSemantics(databaseId, tableId)) - .thenReturn(List.of()); - - /* test */ - final ResponseEntity<List<EntityDto>> response = tableEndpoint.analyseTable(databaseId, tableId); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final List<EntityDto> body = response.getBody(); - assertNotNull(body); - } - - public void analyseTableColumn_generic(Long databaseId, Long tableId, Long columnId) throws QueryMalformedException, - TableColumnNotFoundException { - - /* mock */ - when(tableService.suggestTableColumnSemantics(databaseId, tableId, columnId)) - .thenReturn(List.of()); - - /* test */ - final ResponseEntity<List<TableColumnEntityDto>> response = tableEndpoint.analyseTableColumn(databaseId, tableId, columnId); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final List<TableColumnEntityDto> body = response.getBody(); - assertNotNull(body); - } -} diff --git a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/OntologyServiceIntegrationTest.java b/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/OntologyServiceIntegrationTest.java deleted file mode 100644 index 9ad5afda53..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/OntologyServiceIntegrationTest.java +++ /dev/null @@ -1,124 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.entities.semantics.Ontology; -import at.tuwien.exception.OntologyNotFoundException; -import at.tuwien.exception.UserNotFoundException; -import at.tuwien.repository.mdb.OntologyRepository; -import at.tuwien.repository.mdb.RealmRepository; -import at.tuwien.repository.mdb.UserRepository; -import at.tuwien.repository.sdb.*; -import lombok.extern.log4j.Log4j2; -import org.apache.jena.sys.JenaSystem; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -@Log4j2 -@SpringBootTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@ExtendWith(SpringExtension.class) -public class OntologyServiceIntegrationTest extends BaseUnitTest { - - @MockBean - private UnitIdxRepository unitIdxRepository; - - @MockBean - private ConceptIdxRepository conceptIdxRepository; - - @Autowired - private OntologyService ontologyService; - - @Autowired - private UserRepository userRepository; - - @Autowired - private RealmRepository realmRepository; - - @Autowired - private OntologyRepository ontologyRepository; - - @BeforeAll - public static void beforeAll() { - JenaSystem.init(); - } - - @BeforeEach - public void beforeEach() { - realmRepository.save(REALM_DBREPO); - userRepository.save(USER_1); - ontologyRepository.save(ONTOLOGY_1); - ontologyRepository.save(ONTOLOGY_2); - } - - @Test - public void findAll_succeeds() { - - /* test */ - final List<Ontology> response = ontologyService.findAll(); - assertEquals(2, response.size()); - } - - @Test - public void find_succeeds() throws OntologyNotFoundException { - - /* test */ - final Ontology response = ontologyService.find(ONTOLOGY_1_ID); - assertEquals(ONTOLOGY_1_ID, response.getId()); - assertEquals(ONTOLOGY_1_URI, response.getUri()); - } - - @Test - public void find_fails() { - - /* test */ - assertThrows(OntologyNotFoundException.class, () -> { - ontologyService.find(9999L); - }); - } - - @Test - public void create_succeeds() throws UserNotFoundException { - - /* test */ - final Ontology response = ontologyService.create(ONTOLOGY_3_CREATE_DTO, USER_1_PRINCIPAL); - assertEquals(ONTOLOGY_3_ID, response.getId()); - assertEquals(ONTOLOGY_3_URI, response.getUri()); - } - - @Test - public void create_notFound_fails() { - - /* test */ - assertThrows(UserNotFoundException.class, () -> { - ontologyService.create(ONTOLOGY_3_CREATE_DTO, USER_3_PRINCIPAL); - }); - } - - @Test - public void delete_succeeds() throws OntologyNotFoundException { - - /* test */ - ontologyService.delete(ONTOLOGY_1_ID); - } - - @Test - public void delete_fails() { - - /* test */ - assertThrows(OntologyNotFoundException.class, () -> { - ontologyService.delete(9999L); - }); - } -} diff --git a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/QueryServiceIntegrationTest.java b/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/QueryServiceIntegrationTest.java deleted file mode 100644 index da1f1cc5a0..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/QueryServiceIntegrationTest.java +++ /dev/null @@ -1,142 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.semantics.EntityDto; -import at.tuwien.exception.QueryMalformedException; -import at.tuwien.repository.mdb.OntologyRepository; -import at.tuwien.repository.mdb.RealmRepository; -import at.tuwien.repository.mdb.UserRepository; -import at.tuwien.repository.sdb.*; -import lombok.extern.log4j.Log4j2; -import org.apache.jena.sys.JenaSystem; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -@Log4j2 -@SpringBootTest -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@ExtendWith(SpringExtension.class) -public class QueryServiceIntegrationTest extends BaseUnitTest { - - @MockBean - private UnitIdxRepository unitIdxRepository; - - @MockBean - private ConceptIdxRepository conceptIdxRepository; - - @Autowired - private RealmRepository realmRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private OntologyRepository ontologyRepository; - - @Autowired - private QueryService queryService; - - @BeforeAll - public static void beforeAll() { - JenaSystem.init(); - } - - @BeforeEach - public void beforeEach() { - realmRepository.save(REALM_DBREPO); - userRepository.save(USER_1); - ontologyRepository.saveAll(List.of(ONTOLOGY_1, ONTOLOGY_2, ONTOLOGY_3, ONTOLOGY_4)); - } - - @Test - public void findByLabel_wikidata_succeeds() throws QueryMalformedException { - - /* test */ - final List<EntityDto> response = queryService.findByLabel(ONTOLOGY_2, "Apache Jena"); - assertEquals(1, response.size()); - final EntityDto entity0 = response.get(0); - assertEquals("Apache Jena", entity0.getLabel()); - assertNotNull(entity0.getDescription()) /* user provided */; - } - - @Test - @Disabled - public void findByLabel_measurements_fails() throws QueryMalformedException { - - /* test */ - final List<EntityDto> response = queryService.findByLabel(ONTOLOGY_1, "tonne"); - assertEquals(1, response.size()); - final EntityDto entity0 = response.get(0); - assertEquals(UNIT_2_NAME, entity0.getLabel()); - assertNull(UNIT_2_URI); - assertNull(UNIT_2_DESCRIPTION); - } - - @Test - public void findByLabel_dbpedia_succeeds() throws QueryMalformedException { - - /* test */ - final List<EntityDto> response = queryService.findByLabel(ONTOLOGY_5, "person"); - assertTrue(response.size() >= 1); - final EntityDto entity0 = response.get(0); - assertEquals("person", entity0.getLabel()); - assertNull(entity0.getDescription()); - } - - @Test - public void findByLabel_fails() throws QueryMalformedException { - - /* test */ - final List<EntityDto> response = queryService.findByLabel(ONTOLOGY_2, "apache jena"); - assertEquals(0, response.size()); - } - - @Test - public void findByUri_wikidata_succeeds() throws QueryMalformedException { - - /* test */ - final List<EntityDto> response = queryService.findByUri(ONTOLOGY_2, COLUMN_CONCEPT_TEMPERATURE_URI); - assertEquals(1, response.size()); - final EntityDto entity0 = response.get(0); - assertEquals(COLUMN_CONCEPT_TEMPERATURE_URI, entity0.getUri()); - assertEquals(COLUMN_CONCEPT_TEMPERATURE_NAME, entity0.getLabel()); - assertEquals(COLUMN_CONCEPT_TEMPERATURE_DESCRIPTION, entity0.getDescription()); - } - - @Test - @Disabled - public void findByUri_measurements_fails() throws QueryMalformedException { - - /* test */ - final List<EntityDto> response = queryService.findByUri(ONTOLOGY_1, UNIT_2_URI); - assertEquals(1, response.size()); - final EntityDto entity0 = response.get(0); - assertEquals(UNIT_2_URI, entity0.getUri()); - assertNull(UNIT_2_NAME); - assertNull(UNIT_2_DESCRIPTION); - } - - @Test - public void findByUri_dbpedia_fails() throws QueryMalformedException { - - /* test */ - final List<EntityDto> response = queryService.findByUri(ONTOLOGY_5, "http://dbpedia.org/ontology/person"); - assertEquals(1, response.size()); - final EntityDto entity0 = response.get(0); - assertEquals("http://dbpedia.org/ontology/person", entity0.getUri()); - assertEquals("person", entity0.getLabel()); - assertNull(entity0.getDescription()); - } -} diff --git a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/SemanticServiceUnitTest.java b/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/SemanticServiceUnitTest.java deleted file mode 100644 index 38bd58b129..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/SemanticServiceUnitTest.java +++ /dev/null @@ -1,146 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.database.table.columns.concepts.ConceptDto; -import at.tuwien.api.database.table.columns.concepts.UnitDto; -import at.tuwien.entities.database.table.columns.TableColumnConcept; -import at.tuwien.entities.database.table.columns.TableColumnUnit; -import at.tuwien.repository.mdb.*; -import at.tuwien.repository.sdb.*; -import lombok.extern.log4j.Log4j2; -import org.apache.jena.sys.JenaSystem; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; - - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -@Log4j2 -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class SemanticServiceUnitTest extends BaseUnitTest { - - @MockBean - private UnitIdxRepository unitIdxRepository; - - @MockBean - private ConceptIdxRepository conceptIdxRepository; - - @MockBean - private TableColumnConceptRepository tableColumnConceptRepository; - - @MockBean - private TableColumnUnitRepository tableColumnUnitRepository; - - @Autowired - private SemanticService semanticService; - - @BeforeAll - public static void beforeAll() { - JenaSystem.init(); - } - - @Test - public void findAllConcepts_succeeds() { - - /* mock */ - when(tableColumnConceptRepository.findAll()) - .thenReturn(List.of(COLUMN_CONCEPT_TEMPERATURE)); - - /* test */ - final List<TableColumnConcept> response = semanticService.findAllConcepts(); - assertEquals(1, response.size()); - final TableColumnConcept concept0 = response.get(0); - assertEquals(COLUMN_CONCEPT_TEMPERATURE_URI, concept0.getUri()); - assertEquals(COLUMN_CONCEPT_TEMPERATURE_NAME, concept0.getName()); - } - - @Test - public void findAllUnit_succeeds() { - - /* mock */ - when(tableColumnUnitRepository.findAll()) - .thenReturn(List.of(UNIT_1)); - - /* test */ - final List<TableColumnUnit> response = semanticService.findAllUnits(); - assertEquals(1, response.size()); - final TableColumnUnit unit0 = response.get(0); - assertEquals(UNIT_1_URI, unit0.getUri()); - assertEquals(UNIT_1_NAME, unit0.getName()); - assertEquals(UNIT_1_DESCRIPTION, unit0.getDescription()); - } - - @Test - public void saveUnit_exists_succeeds() { - - /* mock */ - when(unitIdxRepository.save(any(UnitDto.class))) - .thenReturn(UNIT_1_DTO); - when(tableColumnUnitRepository.save(any(TableColumnUnit.class))) - .thenReturn(UNIT_1); - - /* test */ - final TableColumnUnit response = semanticService.saveUnit(UNIT_1_SAVE_DTO); - assertEquals(UNIT_1_URI, response.getUri()); - assertEquals(UNIT_1_NAME, response.getName()); - assertEquals(UNIT_1_DESCRIPTION, response.getDescription()); - } - - @Test - public void saveUnit_succeeds() { - - /* mock */ - when(unitIdxRepository.save(any(UnitDto.class))) - .thenReturn(UNIT_2_DTO); - when(tableColumnUnitRepository.save(any(TableColumnUnit.class))) - .thenReturn(UNIT_2); - - /* test */ - final TableColumnUnit response = semanticService.saveUnit(UNIT_2_SAVE_DTO); - assertEquals(UNIT_2_URI, response.getUri()); - assertEquals(UNIT_2_NAME, response.getName()); - assertEquals(UNIT_2_DESCRIPTION, response.getDescription()); - } - - @Test - public void saveConcept_exists_succeeds() { - - /* mock */ - when(conceptIdxRepository.save(any(ConceptDto.class))) - .thenReturn(COLUMN_CONCEPT_TEMPERATURE_DTO); - when(tableColumnConceptRepository.save(any(TableColumnConcept.class))) - .thenReturn(COLUMN_CONCEPT_TEMPERATURE); - - /* test */ - final TableColumnConcept response = semanticService.saveConcept(COLUMN_CONCEPT_TEMPERATURE_SAVE_DTO); - assertEquals(COLUMN_CONCEPT_TEMPERATURE_URI, response.getUri()); - assertEquals(COLUMN_CONCEPT_TEMPERATURE_NAME, response.getName()); - assertEquals(COLUMN_CONCEPT_TEMPERATURE_DESCRIPTION, response.getDescription()); - } - - @Test - public void saveConcept_succeeds() { - - /* mock */ - when(conceptIdxRepository.save(any(ConceptDto.class))) - .thenReturn(COLUMN_CONCEPT_FAIR_DATA_DTO); - when(tableColumnConceptRepository.save(any(TableColumnConcept.class))) - .thenReturn(COLUMN_CONCEPT_FAIR_DATA); - - /* test */ - final TableColumnConcept response = semanticService.saveConcept(COLUMN_CONCEPT_FAIR_DATA_SAVE_DTO); - assertEquals(COLUMN_CONCEPT_FAIR_DATA_URI, response.getUri()); - assertEquals(COLUMN_CONCEPT_FAIR_DATA_NAME, response.getName()); - assertEquals(COLUMN_CONCEPT_FAIR_DATA_DESCRIPTION, response.getDescription()); - } -} diff --git a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java deleted file mode 100644 index 29ef5b7c39..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.semantics.EntityDto; -import at.tuwien.api.semantics.TableColumnEntityDto; -import at.tuwien.exception.QueryMalformedException; -import at.tuwien.exception.TableColumnNotFoundException; -import at.tuwien.exception.TableNotFoundException; -import at.tuwien.repository.mdb.OntologyRepository; -import at.tuwien.repository.mdb.TableColumnRepository; -import at.tuwien.repository.mdb.TableRepository; -import at.tuwien.repository.sdb.*; -import lombok.extern.log4j.Log4j2; -import org.apache.jena.sys.JenaSystem; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.List; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.when; - -@Log4j2 -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class TableServiceIntegrationTest extends BaseUnitTest { - - @MockBean - private UnitIdxRepository unitIdxRepository; - - @MockBean - private ConceptIdxRepository conceptIdxRepository; - - @MockBean - private TableRepository tableRepository; - - @MockBean - private OntologyRepository ontologyRepository; - - @MockBean - private TableColumnRepository tableColumnRepository; - - @Autowired - private TableService tableService; - - @BeforeAll - public static void beforeAll() { - JenaSystem.init(); - } - - @Test - public void suggestTableSemantics_success() throws TableNotFoundException, QueryMalformedException { - - /* mock */ - when(tableRepository.findByDatabaseIdAndId(DATABASE_1_ID, TABLE_1_ID)) - .thenReturn(Optional.of(TABLE_1)); - when(ontologyRepository.findAll()) - .thenReturn(List.of(ONTOLOGY_1, ONTOLOGY_2, ONTOLOGY_3, ONTOLOGY_4, ONTOLOGY_5)); - - /* test */ - final List<EntityDto> response = tableService.suggestTableSemantics(DATABASE_1_ID, TABLE_1_ID); - assertNotNull(response); - } - - @Test - public void suggestTableColumnSemantics_success() throws QueryMalformedException, TableColumnNotFoundException { - - /* mock */ - when(tableColumnRepository.findById(anyLong())) - .thenReturn(Optional.of(TABLE_1_COLUMNS.get(0))); - when(ontologyRepository.findAll()) - .thenReturn(List.of(ONTOLOGY_1, ONTOLOGY_2, ONTOLOGY_3, ONTOLOGY_4, ONTOLOGY_5)); - - /* test */ - final List<TableColumnEntityDto> response = tableService.suggestTableColumnSemantics(DATABASE_1_ID, TABLE_1_ID, COLUMN_1_1_ID); - assertNotNull(response); - } -} diff --git a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java b/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java deleted file mode 100644 index 23602062cf..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.entities.database.table.Table; -import at.tuwien.exception.TableNotFoundException; -import at.tuwien.repository.mdb.TableRepository; -import at.tuwien.repository.sdb.*; -import lombok.extern.log4j.Log4j2; -import org.apache.jena.sys.JenaSystem; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; - -@Log4j2 -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class TableServiceUnitTest extends BaseUnitTest { - - @MockBean - private UnitIdxRepository unitIdxRepository; - - @MockBean - private ConceptIdxRepository conceptIdxRepository; - - @MockBean - private TableRepository tableRepository; - - @Autowired - private TableService tableService; - - @BeforeAll - public static void beforeAll() { - JenaSystem.init(); - } - - @Test - public void find_success() throws TableNotFoundException { - - /* mock */ - when(tableRepository.findByDatabaseIdAndId(DATABASE_1_ID, TABLE_1_ID)) - .thenReturn(Optional.of(TABLE_1)); - - /* test */ - final Table response = tableService.find(DATABASE_1_ID, TABLE_1_ID); - assertEquals(TABLE_1_ID, response.getId()); - } - - @Test - public void find_fails() { - - /* mock */ - when(tableRepository.findByDatabaseIdAndId(DATABASE_1_ID, TABLE_1_ID)) - .thenReturn(Optional.empty()); - - /* test */ - assertThrows(TableNotFoundException.class, () -> { - tableService.find(DATABASE_1_ID, TABLE_1_ID); - }); - } -} diff --git a/dbrepo-semantics-service/rest-service/src/test/resources/application.properties b/dbrepo-semantics-service/rest-service/src/test/resources/application.properties deleted file mode 100644 index 302797747d..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/resources/application.properties +++ /dev/null @@ -1,28 +0,0 @@ -# enable local spring profile -spring.profiles.active=local - -# disable discovery -spring.cloud.discovery.enabled=false - -# disable cloud config and config discovery -spring.cloud.config.discovery.enabled=false -spring.cloud.config.enabled=false - -# internal datasource -spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver -spring.datasource.url=jdbc:hsqldb:mem:testdb;db_close_delay=-1;sql.syntax_mys=true -spring.jpa.database-platform=org.hibernate.dialect.HSQLDialect -spring.datasource.username=root -spring.datasource.password=dbrepo -spring.sql.init.mode=always -spring.sql.init.schema-locations=classpath*:init/schema.sql -spring.jpa.hibernate.ddl-auto=create - -# log -logging.level.org.hibernate.SQL=trace - -# rabbitmq -spring.rabbitmq.host=dbrepo-broker-service -spring.rabbitmq.virtual-host=/ -spring.rabbitmq.username=guest -spring.rabbitmq.password=guest \ No newline at end of file diff --git a/dbrepo-semantics-service/rest-service/src/test/resources/init/schema.sql b/dbrepo-semantics-service/rest-service/src/test/resources/init/schema.sql deleted file mode 100644 index f8482e47d5..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/resources/init/schema.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE SCHEMA IF NOT EXISTS fda; \ No newline at end of file diff --git a/dbrepo-semantics-service/rest-service/src/test/resources/species/Species.sql b/dbrepo-semantics-service/rest-service/src/test/resources/species/Species.sql deleted file mode 100644 index 957368fcc7..0000000000 --- a/dbrepo-semantics-service/rest-service/src/test/resources/species/Species.sql +++ /dev/null @@ -1,7 +0,0 @@ -/* https://sandbox.zenodo.org/api/files/6aca3421-add3-489b-8c4a-35228fe5c683/species_id.csv */ -CREATE TABLE maldi_ms_data -( - qu VARCHAR(255) NOT NULL, - species VARCHAR(255) NOT NULL, - score VARCHAR(255) NOT NULL -) WITH SYSTEM VERSIONING; \ No newline at end of file diff --git a/dbrepo-semantics-service/rest-service/src/test/resources/traffic/TrafficCh.sql b/dbrepo-semantics-service/rest-service/src/test/resources/traffic/TrafficCh.sql deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-semantics-service/rest-service/src/test/resources/weather/WeatherAus.sql b/dbrepo-semantics-service/rest-service/src/test/resources/weather/WeatherAus.sql deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-semantics-service/services/pom.xml b/dbrepo-semantics-service/services/pom.xml deleted file mode 100644 index b1ee2e0ce7..0000000000 --- a/dbrepo-semantics-service/services/pom.xml +++ /dev/null @@ -1,42 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <artifactId>dbrepo-semantics-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.3.0</version> - </parent> - - <artifactId>services</artifactId> - <version>1.3.0</version> - <name>dbrepo-semantics-service-services</name> - - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <configuration> - <source>${java.version}</source> - <target>${java.version}</target> - <annotationProcessorPaths> - <path> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - <version>${lombok.version}</version> - </path> - <!-- keep this order https://stackoverflow.com/questions/47676369/mapstruct-and-lombok-not-working-together#answer-65021876 --> - <path> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct-processor</artifactId> - <version>${mapstruct.version}</version> - </path> - </annotationProcessorPaths> - </configuration> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/auth/AuthTokenFilter.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/auth/AuthTokenFilter.java deleted file mode 100644 index 92b60f4f8a..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/auth/AuthTokenFilter.java +++ /dev/null @@ -1,100 +0,0 @@ -package at.tuwien.auth; - -import at.tuwien.api.auth.RealmAccessDto; -import at.tuwien.api.user.UserDetailsDto; -import com.auth0.jwt.JWT; -import com.auth0.jwt.JWTVerifier; -import com.auth0.jwt.algorithms.Algorithm; -import com.auth0.jwt.interfaces.DecodedJWT; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.util.StringUtils; -import org.springframework.web.filter.OncePerRequestFilter; - -import java.io.IOException; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.interfaces.RSAPublicKey; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.X509EncodedKeySpec; -import java.util.Arrays; -import java.util.Base64; -import java.util.stream.Collectors; - -@Slf4j -public class AuthTokenFilter extends OncePerRequestFilter { - - @Value("${fda.jwt.issuer}") - private String issuer; - - @Value("${fda.jwt.public_key}") - private String publicKey; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { - final String jwt = parseJwt(request); - if (jwt != null) { - final UserDetails userDetails = verifyJwt(jwt); - log.debug("authenticated user {}", userDetails); - final UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( - userDetails, null, userDetails.getAuthorities()); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - - SecurityContextHolder.getContext().setAuthentication(authentication); - } - filterChain.doFilter(request, response); - } - - public UserDetails verifyJwt(String token) throws ServletException { - final KeyFactory kf; - try { - kf = KeyFactory.getInstance("RSA"); - } catch (NoSuchAlgorithmException e) { - log.error("Failed to find RSA algorithm"); - throw new ServletException("Failed to find RSA algorithm", e); - } - final X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)); - final RSAPublicKey pubKey; - try { - pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509); - } catch (InvalidKeySpecException e) { - log.error("Provided public key is invalid"); - throw new ServletException("Provided public key is invalid", e); - } - final Algorithm algorithm = Algorithm.RSA256(pubKey, null); - JWTVerifier verifier = JWT.require(algorithm) - .withIssuer(issuer) - .withAudience("spring") - .build(); - final DecodedJWT jwt = verifier.verify(token); - final RealmAccessDto realmAccess = jwt.getClaim("realm_access").as(RealmAccessDto.class); - return UserDetailsDto.builder() - .username(jwt.getClaim("client_id").asString()) - .authorities(Arrays.stream(realmAccess.getRoles()).map(SimpleGrantedAuthority::new).collect(Collectors.toList())) - .build(); - } - - /** - * Parses the token from the HTTP header of the request - * - * @param request The request. - * @return The token. - */ - public String parseJwt(HttpServletRequest request) { - String headerAuth = request.getHeader("Authorization"); - if (StringUtils.hasText(headerAuth) && headerAuth.startsWith("Bearer ")) { - return headerAuth.substring(7, headerAuth.length()); - } - return null; - } -} \ No newline at end of file diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/config/GatewayConfig.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/config/GatewayConfig.java deleted file mode 100644 index d89fef950a..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/config/GatewayConfig.java +++ /dev/null @@ -1,40 +0,0 @@ -package at.tuwien.config; - -import lombok.Getter; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.support.BasicAuthenticationInterceptor; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.DefaultUriBuilderFactory; - -@Getter -@Configuration -public class GatewayConfig { - - @Value("${fda.gateway.endpoint}") - private String gatewayEndpoint; - - @Value("${spring.rabbitmq.username}") - private String brokerUsername; - - @Value("${spring.rabbitmq.password}") - private String brokerPassword; - - @Bean - public RestTemplate restTemplate() { - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(gatewayEndpoint)); - return restTemplate; - } - - @Bean("brokerRestTemplate") - public RestTemplate brokerRestTemplate() { - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(gatewayEndpoint)); - restTemplate.getInterceptors() - .add(new BasicAuthenticationInterceptor(brokerUsername, brokerPassword)); - return restTemplate; - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/config/JacksonConfig.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/config/JacksonConfig.java deleted file mode 100644 index c4944a4691..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/config/JacksonConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package at.tuwien.config; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Date; -import java.util.TimeZone; - -@Slf4j -@Configuration -public class JacksonConfig { - - @Bean - public ObjectMapper objectMapper() throws JsonProcessingException { - final ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.registerModule(new Jdk8Module()); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - objectMapper.setTimeZone(TimeZone.getTimeZone("UTC")); - log.debug("current time is {}", objectMapper.writeValueAsString(new Date())); - return objectMapper; - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/config/OpenSearchConfig.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/config/OpenSearchConfig.java deleted file mode 100644 index 48f9f2eeda..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/config/OpenSearchConfig.java +++ /dev/null @@ -1,61 +0,0 @@ -package at.tuwien.config; - -import lombok.extern.log4j.Log4j2; -import org.apache.http.HttpHost; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.opensearch.client.RestClient; -import org.opensearch.client.RestClientBuilder; -import org.opensearch.client.RestHighLevelClient; -import org.opensearch.client.sniff.NodesSniffer; -import org.opensearch.client.sniff.OpenSearchNodesSniffer; -import org.opensearch.client.sniff.Sniffer; -import org.opensearch.data.client.orhlc.AbstractOpenSearchConfiguration; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.TimeUnit; - -@Log4j2 -@Configuration -public class OpenSearchConfig extends AbstractOpenSearchConfiguration { - - @Value("${spring.opensearch.host}") - private String openSearchHost; - - @Value("${spring.opensearch.port}") - private Integer openSearchPort; - - @Value("${spring.opensearch.protocol}") - private String openSearchProtocol; - - @Value("${spring.opensearch.username}") - private String openSearchUsername; - - @Value("${spring.opensearch.password}") - private String openSearchPassword; - - @Bean - @Override - public RestHighLevelClient opensearchClient() { - log.debug("open search endpoint: {}://{}:{}", openSearchProtocol, openSearchHost, openSearchPort); - final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); - credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(openSearchUsername, openSearchPassword)); - RestClientBuilder builder = RestClient.builder(new HttpHost(openSearchHost, openSearchPort, openSearchProtocol)) - .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)); - return new RestHighLevelClient(builder); - } - - @Bean - public Sniffer nodesSniffer() { - final NodesSniffer nodesSniffer = new OpenSearchNodesSniffer(opensearchClient().getLowLevelClient(), - TimeUnit.SECONDS.toMillis(5), OpenSearchNodesSniffer.Scheme.HTTP); - return Sniffer.builder(opensearchClient().getLowLevelClient()) - .setNodesSniffer(nodesSniffer) - .build(); - - } -} \ No newline at end of file diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java deleted file mode 100644 index 8b4729dcf0..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java +++ /dev/null @@ -1,96 +0,0 @@ -package at.tuwien.config; - -import at.tuwien.auth.AuthTokenFilter; -import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; -import io.swagger.v3.oas.annotations.security.SecurityScheme; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import org.springframework.security.web.util.matcher.OrRequestMatcher; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; - -import jakarta.servlet.http.HttpServletResponse; - -@Configuration -@EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true) -@SecurityScheme( - name = "bearerAuth", - type = SecuritySchemeType.HTTP, - bearerFormat = "JWT", - scheme = "bearer" -) -public class WebSecurityConfig { - - @Bean - public AuthTokenFilter authTokenFilter() { - return new AuthTokenFilter(); - } - - @Bean - public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - final OrRequestMatcher internalEndpoints = new OrRequestMatcher( - new AntPathRequestMatcher("/actuator/**", "GET"), - new AntPathRequestMatcher("/v3/api-docs.yaml"), - new AntPathRequestMatcher("/v3/api-docs/**"), - new AntPathRequestMatcher("/swagger-ui/**"), - new AntPathRequestMatcher("/swagger-ui.html") - ); - final OrRequestMatcher publicEndpoints = new OrRequestMatcher( - new AntPathRequestMatcher("/api/semantic/ontology/**", "GET"), - new AntPathRequestMatcher("/api/semantic/concept", "GET"), - new AntPathRequestMatcher("/api/semantic/unit", "GET") - ); - /* enable CORS and disable CSRF */ - http = http.cors().and().csrf().disable(); - /* set session management to stateless */ - http = http - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and(); - /* set unauthorized requests exception handler */ - http = http - .exceptionHandling() - .authenticationEntryPoint( - (request, response, ex) -> { - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, - ex.getMessage() - ); - } - ).and(); - /* set permissions on endpoints */ - http.authorizeHttpRequests() - /* our internal endpoints */ - .requestMatchers(internalEndpoints).permitAll() - /* our public endpoints */ - .requestMatchers(publicEndpoints).permitAll() - /* our private endpoints */ - .anyRequest().authenticated(); - /* add JWT token filter */ - http.addFilterBefore(authTokenFilter(), - UsernamePasswordAuthenticationFilter.class - ); - return http.build(); - } - - @Bean - public CorsFilter corsFilter() { - final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - final CorsConfiguration config = new CorsConfiguration(); - config.setAllowCredentials(true); - config.addAllowedOriginPattern("*"); - config.addAllowedHeader("*"); - config.addAllowedMethod("*"); - source.registerCorsConfiguration("/**", config); - return new CorsFilter(source); - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/FilterBadRequestException.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/FilterBadRequestException.java deleted file mode 100644 index 7364f797a3..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/FilterBadRequestException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.BAD_REQUEST) -public class FilterBadRequestException extends Exception { - - public FilterBadRequestException(String msg) { - super(msg); - } - - public FilterBadRequestException(String msg, Throwable thr) { - super(msg, thr); - } - - public FilterBadRequestException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/OntologyNotFoundException.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/OntologyNotFoundException.java deleted file mode 100644 index cb82fc0b9a..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/OntologyNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class OntologyNotFoundException extends Exception { - - public OntologyNotFoundException(String msg) { - super(msg); - } - - public OntologyNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public OntologyNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/QueryMalformedException.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/QueryMalformedException.java deleted file mode 100644 index 751bc2fb7a..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/QueryMalformedException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.EXPECTATION_FAILED) -public class QueryMalformedException extends Exception { - - public QueryMalformedException(String msg) { - super(msg); - } - - public QueryMalformedException(String msg, Throwable thr) { - super(msg, thr); - } - - public QueryMalformedException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/TableColumnNotFoundException.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/TableColumnNotFoundException.java deleted file mode 100644 index e83abd5eef..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/TableColumnNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class TableColumnNotFoundException extends Exception { - - public TableColumnNotFoundException(String msg) { - super(msg); - } - - public TableColumnNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public TableColumnNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/TableNotFoundException.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/TableNotFoundException.java deleted file mode 100644 index 89fa3ed467..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/TableNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class TableNotFoundException extends Exception { - - public TableNotFoundException(String msg) { - super(msg); - } - - public TableNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public TableNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/UriMalformedException.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/UriMalformedException.java deleted file mode 100644 index 92f102fb56..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/UriMalformedException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.EXPECTATION_FAILED) -public class UriMalformedException extends Exception { - - public UriMalformedException(String msg) { - super(msg); - } - - public UriMalformedException(String msg, Throwable thr) { - super(msg, thr); - } - - public UriMalformedException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/UserNotFoundException.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/UserNotFoundException.java deleted file mode 100644 index f758f7ddf3..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/exception/UserNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class UserNotFoundException extends Exception { - - public UserNotFoundException(String msg) { - super(msg); - } - - public UserNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public UserNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/mapper/OntologyMapper.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/mapper/OntologyMapper.java deleted file mode 100644 index 4d36f77a67..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/mapper/OntologyMapper.java +++ /dev/null @@ -1,119 +0,0 @@ -package at.tuwien.mapper; - -import at.tuwien.api.database.table.columns.concepts.*; -import at.tuwien.api.semantics.OntologyBriefDto; -import at.tuwien.api.semantics.OntologyCreateDto; -import at.tuwien.api.semantics.OntologyDto; -import at.tuwien.entities.database.table.columns.TableColumnConcept; -import at.tuwien.entities.database.table.columns.TableColumnUnit; -import at.tuwien.entities.semantics.Ontology; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; - -import java.util.List; - - -@Mapper(componentModel = "spring") -public interface OntologyMapper { - - org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(OntologyMapper.class); - - @Mappings({ - @Mapping(target = "rdf", expression = "java(true)"), - @Mapping(target = "sparql", expression = "java(data.getSparqlEndpoint() != null)") - }) - OntologyDto ontologyToOntologyDto(Ontology data); - - @Mappings({ - @Mapping(target = "rdf", expression = "java(true)"), - @Mapping(target = "sparql", expression = "java(data.getSparqlEndpoint() != null)") - }) - OntologyBriefDto ontologyToOntologyBriefDto(Ontology data); - - Ontology ontologyCreateDtoToOntology(OntologyCreateDto data); - - ConceptDto tableColumnConceptToConceptDto(TableColumnConcept data); - - UnitDto tableColumnUnitToUnitDto(TableColumnUnit data); - - TableColumnUnit unitSaveDtoToTableColumnUnit(UnitSaveDto data); - - TableColumnConcept conceptSaveDtoToTableColumnConcept(ConceptSaveDto data); - - default String defaultNamespaces(List<Ontology> data) { - return String.join("\n", - data.stream() - .map(o -> "PREFIX " + o.getPrefix() + ": <" + o.getUri() + ">") - .toList()); - } - - default String ontologyToFindByLabelQuery(List<Ontology> ontologies, Ontology ontology, String label, Integer limit) { - if (ontology.getSparqlEndpoint() != null) { - /* prefer SPARQL endpoint over rdf */ - return String.join("\n", - defaultNamespaces(ontologies), - "SELECT * {", - " SERVICE <" + ontology.getSparqlEndpoint() + "> {", - " SELECT ?o ?label ?description {", - " ?o rdfs:label \"" + label.replace("\"", "") + "\"@en .", - " ?o rdfs:label ?label .", - " FILTER (LANG(?label) = 'en')", - " OPTIONAL {", - " ?o schema:description ?description", - " FILTER (LANG(?description) = 'en')", - " }", - " } LIMIT " + limit, - " }", - "}"); - } - return String.join("\n", - defaultNamespaces(ontologies), - "SELECT ?o ?label ?comment {", - " ?o rdfs:label \"" + label.replace("\"", "") + "\"@en .", - " OPTIONAL {", - " ?o rdfs:label ?label", - " FILTER (LANG(?label) = 'en')", - " }", - " OPTIONAL {", - " ?o schema:description ?description", - " FILTER (LANG(?description) = 'en')", - " }", - "} LIMIT " + limit); - } - - default String ontologyToFindByUriQuery(List<Ontology> ontologies, Ontology ontology, String uri) { - if (ontology.getSparqlEndpoint() != null) { - /* prefer SPARQL endpoint over rdf */ - return String.join("\n", - defaultNamespaces(ontologies), - "SELECT * {", - " SERVICE <" + ontology.getSparqlEndpoint() + "> {", - " SELECT ?label ?description {", - " OPTIONAL {", - " <" + uri + "> rdfs:label ?label", - " FILTER (LANG(?label) = 'en')", - " }", - " OPTIONAL {", - " <" + uri + "> schema:description ?description", - " FILTER (LANG(?description) = 'en')", - " }", - " } LIMIT 1", - " }", - "}"); - } - return String.join("\n", - defaultNamespaces(ontologies), - "SELECT ?label ?description {", - " OPTIONAL {", - " <" + uri + "> rdfs:label ?label", - " FILTER (LANG(?label) = 'en')", - " }", - " OPTIONAL {", - " <" + uri + "> schema:description ?description", - " FILTER (LANG(?description) = 'en')", - " }", - "} LIMIT 1"); - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/mapper/SemanticMapper.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/mapper/SemanticMapper.java deleted file mode 100644 index 95c56e0a5c..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/mapper/SemanticMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package at.tuwien.mapper; - -import at.tuwien.api.database.table.columns.concepts.ConceptDto; -import at.tuwien.api.database.table.columns.concepts.UnitDto; -import at.tuwien.entities.database.table.columns.TableColumnConcept; -import at.tuwien.entities.database.table.columns.TableColumnUnit; -import org.mapstruct.Mapper; - - -@Mapper(componentModel = "spring", uses = {TableMapper.class}) -public interface SemanticMapper { - - org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(SemanticMapper.class); - - ConceptDto tableColumnConceptToConceptDto(TableColumnConcept data); - - UnitDto tableColumnUnitToUnitDto(TableColumnUnit data); -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/mapper/TableMapper.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/mapper/TableMapper.java deleted file mode 100644 index de566881e5..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/mapper/TableMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package at.tuwien.mapper; - -import at.tuwien.api.database.table.columns.ColumnBriefDto; -import at.tuwien.api.database.table.columns.ColumnDto; -import at.tuwien.entities.database.table.columns.TableColumn; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; - - -@Mapper(componentModel = "spring") -public interface TableMapper { - - org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(TableMapper.class); - - @Mappings({ - @Mapping(target = "tableId", source = "table.id"), - }) - ColumnBriefDto tableColumnToColumnBriefDto(TableColumn data); - - @Mappings({ - @Mapping(target = "tableId", source = "table.id"), - }) - ColumnDto tableColumnToColumnDto(TableColumn data); -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/ContainerRepository.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/ContainerRepository.java deleted file mode 100644 index f41d2aa3fa..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/ContainerRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.container.Container; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ContainerRepository extends JpaRepository<Container, Long> { - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/DatabaseRepository.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/DatabaseRepository.java deleted file mode 100644 index c11a773abc..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/DatabaseRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.database.Database; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface DatabaseRepository extends JpaRepository<Database, Long> { - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/ImageRepository.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/ImageRepository.java deleted file mode 100644 index 046fd51c3e..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/ImageRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.container.image.ContainerImage; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ImageRepository extends JpaRepository<ContainerImage, Long> { - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/OntologyRepository.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/OntologyRepository.java deleted file mode 100644 index fab911633e..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/OntologyRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.semantics.Ontology; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface OntologyRepository extends JpaRepository<Ontology, Long> { - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/RealmRepository.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/RealmRepository.java deleted file mode 100644 index 7b53e72459..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/RealmRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.user.Realm; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.UUID; - -@Repository -public interface RealmRepository extends JpaRepository<Realm, UUID> { - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableColumnConceptRepository.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableColumnConceptRepository.java deleted file mode 100644 index 63fe90eea7..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableColumnConceptRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.database.table.columns.TableColumnConcept; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface TableColumnConceptRepository extends JpaRepository<TableColumnConcept, String> { - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableColumnRepository.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableColumnRepository.java deleted file mode 100644 index 004f202d03..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableColumnRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.database.table.columns.TableColumn; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface TableColumnRepository extends JpaRepository<TableColumn, Long> { - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableColumnUnitRepository.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableColumnUnitRepository.java deleted file mode 100644 index ef80b22e06..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableColumnUnitRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.database.table.columns.TableColumnUnit; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface TableColumnUnitRepository extends JpaRepository<TableColumnUnit, String> { - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableRepository.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableRepository.java deleted file mode 100644 index 051a51f943..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/TableRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.database.table.Table; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public interface TableRepository extends JpaRepository<Table, Long> { - - Optional<Table> findByDatabaseIdAndId(Long databaseId, Long tableId); - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/UserRepository.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/UserRepository.java deleted file mode 100644 index 42d09c3e9e..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/mdb/UserRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.user.User; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; -import java.util.UUID; - -@Repository -public interface UserRepository extends JpaRepository<User, UUID> { - - Optional<User> findByUsername(String username); - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/sdb/ConceptIdxRepository.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/sdb/ConceptIdxRepository.java deleted file mode 100644 index a311002ac3..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/sdb/ConceptIdxRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien.repository.sdb; - -import at.tuwien.api.database.table.columns.concepts.ConceptDto; -import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ConceptIdxRepository extends ElasticsearchRepository<ConceptDto, String> { -} \ No newline at end of file diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/sdb/UnitIdxRepository.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/sdb/UnitIdxRepository.java deleted file mode 100644 index 5b7301819e..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/repository/sdb/UnitIdxRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien.repository.sdb; - -import at.tuwien.api.database.table.columns.concepts.UnitDto; -import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface UnitIdxRepository extends ElasticsearchRepository<UnitDto, String> { -} \ No newline at end of file diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/OntologyService.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/OntologyService.java deleted file mode 100644 index 4a55f52491..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/OntologyService.java +++ /dev/null @@ -1,22 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.api.semantics.OntologyCreateDto; -import at.tuwien.api.semantics.OntologyModifyDto; -import at.tuwien.entities.semantics.Ontology; -import at.tuwien.exception.OntologyNotFoundException; -import at.tuwien.exception.UserNotFoundException; - -import java.security.Principal; -import java.util.List; - -public interface OntologyService { - List<Ontology> findAll(); - - Ontology find(Long id) throws OntologyNotFoundException; - - Ontology create(OntologyCreateDto data, Principal principal) throws UserNotFoundException; - - Ontology update(Long id, OntologyModifyDto data) throws OntologyNotFoundException; - - void delete(Long id) throws OntologyNotFoundException; -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/QueryService.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/QueryService.java deleted file mode 100644 index 5ab8bda66d..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/QueryService.java +++ /dev/null @@ -1,16 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.api.semantics.EntityDto; -import at.tuwien.entities.semantics.Ontology; -import at.tuwien.exception.QueryMalformedException; - -import java.util.List; - -public interface QueryService { - - List<EntityDto> findByLabel(Ontology ontology, String label) throws QueryMalformedException; - - List<EntityDto> findByLabel(Ontology ontology, String label, Integer limit) throws QueryMalformedException; - - List<EntityDto> findByUri(Ontology ontology, String uri) throws QueryMalformedException; -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/SemanticService.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/SemanticService.java deleted file mode 100644 index 564b739af0..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/SemanticService.java +++ /dev/null @@ -1,18 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.api.database.table.columns.concepts.ConceptSaveDto; -import at.tuwien.api.database.table.columns.concepts.UnitSaveDto; -import at.tuwien.entities.database.table.columns.TableColumnConcept; -import at.tuwien.entities.database.table.columns.TableColumnUnit; - -import java.util.List; - -public interface SemanticService { - List<TableColumnConcept> findAllConcepts(); - - List<TableColumnUnit> findAllUnits(); - - TableColumnConcept saveConcept(ConceptSaveDto data); - - TableColumnUnit saveUnit(UnitSaveDto data); -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/TableService.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/TableService.java deleted file mode 100644 index e1294a9425..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/TableService.java +++ /dev/null @@ -1,20 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.api.semantics.EntityDto; -import at.tuwien.api.semantics.TableColumnEntityDto; -import at.tuwien.entities.database.table.Table; -import at.tuwien.exception.QueryMalformedException; -import at.tuwien.exception.TableColumnNotFoundException; -import at.tuwien.exception.TableNotFoundException; - -import java.util.List; - -public interface TableService { - Table find(Long databaseId, Long tableId) throws TableNotFoundException; - - List<EntityDto> suggestTableSemantics(Long databaseId, Long tableId) throws TableNotFoundException, - QueryMalformedException; - - List<TableColumnEntityDto> suggestTableColumnSemantics(Long databaseId, Long tableId, Long columnId) - throws QueryMalformedException, TableColumnNotFoundException; -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/UserService.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/UserService.java deleted file mode 100644 index 6de26b3ffc..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/UserService.java +++ /dev/null @@ -1,8 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.entities.user.User; -import at.tuwien.exception.UserNotFoundException; - -public interface UserService { - User findByUsername(String username) throws UserNotFoundException; -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/OntologyServiceImpl.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/OntologyServiceImpl.java deleted file mode 100644 index 411ea767ec..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/OntologyServiceImpl.java +++ /dev/null @@ -1,82 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.semantics.OntologyCreateDto; -import at.tuwien.api.semantics.OntologyModifyDto; -import at.tuwien.entities.semantics.Ontology; -import at.tuwien.entities.user.User; -import at.tuwien.exception.OntologyNotFoundException; -import at.tuwien.exception.UserNotFoundException; -import at.tuwien.mapper.OntologyMapper; -import at.tuwien.repository.mdb.OntologyRepository; -import at.tuwien.service.OntologyService; -import at.tuwien.service.UserService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.security.Principal; -import java.util.List; -import java.util.Optional; - -@Log4j2 -@Service -public class OntologyServiceImpl implements OntologyService { - - private final UserService userService; - private final OntologyMapper ontologyMapper; - private final OntologyRepository ontologyRepository; - - @Autowired - public OntologyServiceImpl(UserService userService, OntologyMapper ontologyMapper, - OntologyRepository ontologyRepository) { - this.userService = userService; - this.ontologyMapper = ontologyMapper; - this.ontologyRepository = ontologyRepository; - } - - @Override - public List<Ontology> findAll() { - return ontologyRepository.findAll(); - } - - @Override - public Ontology find(Long id) throws OntologyNotFoundException { - final Optional<Ontology> optional = ontologyRepository.findById(id); - if (optional.isEmpty()) { - log.error("Failed to find ontology with id {}", id); - throw new OntologyNotFoundException("Failed to find ontology with id " + id); - } - return optional.get(); - } - - @Override - public Ontology create(OntologyCreateDto data, Principal principal) throws UserNotFoundException { - final User user = userService.findByUsername(principal.getName()); - final Ontology entity = ontologyMapper.ontologyCreateDtoToOntology(data); - entity.setCreatedBy(user.getId()); - final Ontology ontology = ontologyRepository.save(entity); - log.info("Created ontology with id {}", ontology.getId()); - return ontology; - } - - @Override - public Ontology update(Long id, OntologyModifyDto data) throws OntologyNotFoundException { - final Ontology entity = find(id); - entity.setPrefix(data.getPrefix()); - entity.setUri(data.getUri()); - entity.setSparqlEndpoint(data.getSparqlEndpoint()); - final Ontology ontology = ontologyRepository.save(entity); - log.info("Update ontology with id {}", ontology.getId()); - return ontology; - } - - @Override - public void delete(Long id) throws OntologyNotFoundException { - if (!ontologyRepository.existsById(id)) { - log.error("Failed to delete ontology: ontology with id {} does not exist", id); - throw new OntologyNotFoundException("Failed to delete ontology: ontology with id " + id + " does not exist"); - } - ontologyRepository.deleteById(id); - log.info("Deleted ontology with id {}", id); - } -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/QueryServiceImpl.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/QueryServiceImpl.java deleted file mode 100644 index 802b0e7a07..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/QueryServiceImpl.java +++ /dev/null @@ -1,91 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.semantics.EntityDto; -import at.tuwien.entities.semantics.Ontology; -import at.tuwien.exception.QueryMalformedException; -import at.tuwien.mapper.OntologyMapper; -import at.tuwien.repository.mdb.OntologyRepository; -import at.tuwien.service.QueryService; -import lombok.extern.log4j.Log4j2; -import org.apache.jena.query.*; -import org.apache.jena.rdf.model.RDFNode; -import org.apache.jena.riot.RiotException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -@Log4j2 -@Service -public class QueryServiceImpl implements QueryService { - - private final Dataset dataset; - private final OntologyMapper ontologyMapper; - private final OntologyRepository ontologyRepository; - - @Autowired - public QueryServiceImpl(OntologyRepository ontologyRepository, OntologyMapper ontologyMapper) { - this.ontologyMapper = ontologyMapper; - this.ontologyRepository = ontologyRepository; - this.dataset = DatasetFactory.create(); - } - - @Override - public List<EntityDto> findByLabel(Ontology ontology, String label) throws QueryMalformedException { - return findByLabel(ontology, label, 10); - } - - @Override - public List<EntityDto> findByLabel(Ontology ontology, String label, Integer limit) throws QueryMalformedException { - final List<Ontology> ontologies = ontologyRepository.findAll(); - final String statement = ontologyMapper.ontologyToFindByLabelQuery(ontologies, ontology, label, limit); - log.trace("execute sparql query:\n{}", statement); - final List<EntityDto> results = new LinkedList<>(); - try (QueryExecution execution = QueryExecutionFactory.create(statement, this.dataset.getDefaultModel())) { - final Iterator<QuerySolution> resultSet = execution.execSelect(); - while (resultSet.hasNext()) { - final QuerySolution solution = resultSet.next(); - final RDFNode description = solution.get("description"); - final EntityDto entity = EntityDto.builder() - .uri(solution.get("o").toString()) - .label(label) - .description(description != null ? description.asLiteral().getLexicalForm() : null) - .build(); - results.add(entity); - } - } catch (QueryParseException | IllegalArgumentException | RiotException e) { - log.error("Failed to parse query: {}", e.getMessage()); - throw new QueryMalformedException("Failed to parse query: " + e.getMessage(), e); - } - return results; - } - - @Override - public List<EntityDto> findByUri(Ontology ontology, String uri) throws QueryMalformedException { - final List<Ontology> ontologies = ontologyRepository.findAll(); - final String statement = ontologyMapper.ontologyToFindByUriQuery(ontologies, ontology, uri); - log.trace("execute sparql query:\n{}", statement); - try (QueryExecution execution = QueryExecutionFactory.create(statement, this.dataset.getDefaultModel())) { - final Iterator<QuerySolution> resultSet = execution.execSelect(); - final List<EntityDto> results = new LinkedList<>(); - while (resultSet.hasNext()) { - final QuerySolution solution = resultSet.next(); - final RDFNode label = solution.get("label"); - final RDFNode description = solution.get("description"); - final EntityDto entity = EntityDto.builder() - .uri(uri) - .label(label != null ? label.asLiteral().getLexicalForm() : null) - .description(description != null ? description.asLiteral().getLexicalForm() : null) - .build(); - results.add(entity); - } - return results; - } catch (QueryParseException | IllegalArgumentException | RiotException e) { - log.error("Failed to parse query: {}", e.getMessage()); - throw new QueryMalformedException("Failed to parse query: " + e.getMessage(), e); - } - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/SemanticServiceImpl.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/SemanticServiceImpl.java deleted file mode 100644 index fd2365ac62..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/SemanticServiceImpl.java +++ /dev/null @@ -1,79 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.database.table.columns.concepts.ConceptSaveDto; -import at.tuwien.api.database.table.columns.concepts.UnitSaveDto; -import at.tuwien.entities.database.table.columns.TableColumnConcept; -import at.tuwien.entities.database.table.columns.TableColumnUnit; -import at.tuwien.mapper.OntologyMapper; -import at.tuwien.repository.mdb.TableColumnConceptRepository; -import at.tuwien.repository.mdb.TableColumnUnitRepository; -import at.tuwien.repository.sdb.ConceptIdxRepository; -import at.tuwien.repository.sdb.UnitIdxRepository; -import at.tuwien.service.SemanticService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@Log4j2 -@Service -public class SemanticServiceImpl implements SemanticService { - - private final OntologyMapper ontologyMapper; - private final UnitIdxRepository unitIdxRepository; - private final ConceptIdxRepository conceptIdxRepository; - private final TableColumnUnitRepository tableColumnUnitRepository; - private final TableColumnConceptRepository tableColumnConceptRepository; - - @Autowired - public SemanticServiceImpl(TableColumnConceptRepository tableColumnConceptRepository, - TableColumnUnitRepository tableColumnUnitRepository, OntologyMapper ontologyMapper, - UnitIdxRepository unitIdxRepository, ConceptIdxRepository conceptIdxRepository) { - this.ontologyMapper = ontologyMapper; - this.unitIdxRepository = unitIdxRepository; - this.conceptIdxRepository = conceptIdxRepository; - this.tableColumnUnitRepository = tableColumnUnitRepository; - this.tableColumnConceptRepository = tableColumnConceptRepository; - } - - @Override - @Transactional(readOnly = true) - public List<TableColumnConcept> findAllConcepts() { - return tableColumnConceptRepository.findAll(); - } - - @Override - @Transactional(readOnly = true) - public List<TableColumnUnit> findAllUnits() { - return tableColumnUnitRepository.findAll(); - } - - @Override - @Transactional - public TableColumnConcept saveConcept(ConceptSaveDto data) { - final TableColumnConcept entity = ontologyMapper.conceptSaveDtoToTableColumnConcept(data); - /* save in metadata database */ - final TableColumnConcept concept = tableColumnConceptRepository.save(entity); - log.info("Saved concept with id {} in metadata database", concept.getId()); - /* save in open search database */ - conceptIdxRepository.save(ontologyMapper.tableColumnConceptToConceptDto(concept)); - log.info("Saved concept with id {} in open search database", concept.getId()); - return concept; - } - - @Override - @Transactional - public TableColumnUnit saveUnit(UnitSaveDto data) { - final TableColumnUnit entity = ontologyMapper.unitSaveDtoToTableColumnUnit(data); - /* save in metadata database */ - final TableColumnUnit unit = tableColumnUnitRepository.save(entity); - log.info("Saved unit with id {} in metadata database", unit.getId()); - /* save in open search database */ - unitIdxRepository.save(ontologyMapper.tableColumnUnitToUnitDto(unit)); - log.info("Saved unit with id {} in open search database", unit.getId()); - return unit; - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java deleted file mode 100644 index d4c2c6f267..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java +++ /dev/null @@ -1,94 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.semantics.EntityDto; -import at.tuwien.api.semantics.TableColumnEntityDto; -import at.tuwien.entities.database.table.Table; -import at.tuwien.entities.database.table.columns.TableColumn; -import at.tuwien.entities.semantics.Ontology; -import at.tuwien.exception.QueryMalformedException; -import at.tuwien.exception.TableColumnNotFoundException; -import at.tuwien.exception.TableNotFoundException; -import at.tuwien.repository.mdb.TableColumnRepository; -import at.tuwien.repository.mdb.TableRepository; -import at.tuwien.service.OntologyService; -import at.tuwien.service.QueryService; -import at.tuwien.service.TableService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.LinkedList; -import java.util.List; -import java.util.Optional; - -@Log4j2 -@Service -public class TableServiceImpl implements TableService { - - private final QueryService queryService; - private final OntologyService ontologyService; - private final TableRepository tableRepository; - private final TableColumnRepository tableColumnRepository; - - @Autowired - public TableServiceImpl(OntologyService ontologyService, TableRepository tableRepository, QueryService queryService, - TableColumnRepository tableColumnRepository) { - this.queryService = queryService; - this.ontologyService = ontologyService; - this.tableRepository = tableRepository; - this.tableColumnRepository = tableColumnRepository; - } - - @Override - @Transactional(readOnly = true) - public Table find(Long databaseId, Long tableId) throws TableNotFoundException { - final Optional<Table> optional = tableRepository.findByDatabaseIdAndId(databaseId, tableId); - if (optional.isEmpty()) { - log.error("Failed to find table with id {} in database with id {}", tableId, databaseId); - throw new TableNotFoundException("Failed to find table with id " + tableId + " in database with id " + databaseId); - } - return optional.get(); - } - - @Override - @Transactional(readOnly = true) - public List<EntityDto> suggestTableSemantics(Long databaseId, Long tableId) throws TableNotFoundException, - QueryMalformedException { - final Table table = find(databaseId, tableId); - final List<EntityDto> suggestions = new LinkedList<>(); - for (Ontology ontology : ontologyService.findAll()) { - suggestions.addAll(queryService.findByLabel(ontology, table.getName(), 3)); - } - log.debug("suggested {} semantic entities total", suggestions.size()); - return suggestions; - } - - @Override - @Transactional(readOnly = true) - public List<TableColumnEntityDto> suggestTableColumnSemantics(Long databaseId, Long tableId, Long columnId) - throws QueryMalformedException, TableColumnNotFoundException { - final Optional<TableColumn> optional = tableColumnRepository.findById(columnId); - if (optional.isEmpty()) { - log.error("Failed to find column with id {}", columnId); - throw new TableColumnNotFoundException("Failed to find column with id " + columnId); - } - final List<TableColumnEntityDto> suggestions = new LinkedList<>(); - for (Ontology ontology : ontologyService.findAll()) { - suggestions.addAll(queryService.findByLabel(ontology, optional.get().getName(), 3) - .stream() - .map(e -> TableColumnEntityDto.builder() - .databaseId(databaseId) - .tableId(tableId) - .columnId(optional.get().getId()) - .label(e.getLabel()) - .uri(e.getUri()) - .description(e.getDescription()) - .build()) - .toList()); - } - log.debug("suggested {} semantic entities total", suggestions.size()); - return suggestions; - } - -} diff --git a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java b/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java deleted file mode 100644 index 43e1ae2d23..0000000000 --- a/dbrepo-semantics-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.entities.user.User; -import at.tuwien.exception.UserNotFoundException; -import at.tuwien.repository.mdb.UserRepository; -import at.tuwien.service.UserService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -@Log4j2 -@Service -public class UserServiceImpl implements UserService { - - private final UserRepository userRepository; - - @Autowired - public UserServiceImpl(UserRepository userRepository) { - this.userRepository = userRepository; - } - - @Override - public User findByUsername(String username) throws UserNotFoundException { - final Optional<User> optional = userRepository.findByUsername(username); - if (optional.isEmpty()) { - log.error("Failed to find user with username {}", username); - throw new UserNotFoundException("Failed to find user with username " + username); - } - return optional.get(); - } - -} diff --git a/dbrepo-user-service/.gitignore b/dbrepo-user-service/.gitignore deleted file mode 100644 index d68acdb421..0000000000 --- a/dbrepo-user-service/.gitignore +++ /dev/null @@ -1,44 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -# Documentation -docs/*.html -docs/css/ -docs/images/ - -# Docker -ready - -## JUnit -.attach_pid* - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ diff --git a/dbrepo-user-service/Dockerfile b/dbrepo-user-service/Dockerfile deleted file mode 100644 index 67f852e337..0000000000 --- a/dbrepo-user-service/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -###### FIRST STAGE ###### -FROM dbrepo-metadata-db:latest as dependency -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -###### SECOND STAGE ###### -FROM maven:3-openjdk-17 as build -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -COPY ./pom.xml ./ - -RUN mvn -fn -B dependency:go-offline > /dev/null - -COPY --from=dependency /root/.m2/repository/at/tuwien /root/.m2/repository/at/tuwien - -COPY ./rest-service ./rest-service -COPY ./services ./services -COPY ./report ./report - -# Make sure it compiles -RUN mvn -q clean package -DskipTests - -###### THIRD STAGE ###### -FROM openjdk:17-alpine as runtime -MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> - -ENV METADATA_DB=fda -ENV METADATA_USERNAME=root -ENV METADATA_PASSWORD=dbrepo -ENV GATEWAY_ENDPOINT=http://gateway-service -ENV JWT_ISSUER="http://localhost/realms/dbrepo" -ENV JWT_PUBKEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB" -ENV LOG_LEVEL=debug -ENV SEARCH_PASSWORD=admin - -WORKDIR /app - -COPY --from=build ./rest-service/target/rest-service-*.jar ./user-service.jar - -EXPOSE 9098 - -ENTRYPOINT ["java", "-Dlog4j2.formatMsgNoLookups=true", "-jar", "./user-service.jar"] diff --git a/dbrepo-user-service/README.md b/dbrepo-user-service/README.md deleted file mode 100644 index ae61ee03af..0000000000 --- a/dbrepo-user-service/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# User Service - -## Actuator - -- Actuator Info: http://localhost:9098/actuator/info -- Actuator Health: http://localhost:9098/actuator/health -- Actuator Prometheus: http://localhost:9098/actuator/prometheus - -## Swagger UI Endpoints - -- Swagger UI: http://localhost:9098/swagger-ui/index.html - -## OpenAPI Endpoints - -- OpenAPI v3 as .yaml: http://localhost:9098/v3/api-docs.yaml \ No newline at end of file diff --git a/dbrepo-user-service/pom.xml b/dbrepo-user-service/pom.xml deleted file mode 100644 index 58c0085e5a..0000000000 --- a/dbrepo-user-service/pom.xml +++ /dev/null @@ -1,299 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-parent</artifactId> - <version>3.0.6</version> - </parent> - - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-user-service</artifactId> - <version>1.3.0</version> - <name>dbrepo-user-service</name> - <description> - The query service provides an interface to insert data into the tables created by the table service. It - also allows for view-only (possibly paginated and versioned) query execution to the raw data and consumes - messages in the message queue from the Broker Service. - </description> - <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/</url> - <developers> - <developer> - <name>Martin Weise</name> - <email>martin.weise@tuwien.ac.at</email> - <organization>TU Wien</organization> - </developer> - <developer> - <name>Moritz Staudinger</name> - <email>moritz.staudinger@tuwien.ac.at</email> - <organization>TU Wien</organization> - </developer> - </developers> - - <packaging>pom</packaging> - <modules> - <module>rest-service</module> - <module>services</module> - <module>report</module> - </modules> - - <properties> - <java.version>17</java.version> - <spring-cloud.version>4.0.2</spring-cloud.version> - <mapstruct.version>1.5.5.Final</mapstruct.version> - <jacoco.version>0.8.10</jacoco.version> - <jwt.version>4.3.0</jwt.version> - <hibernate-c3po.version>5.6.3.Final</hibernate-c3po.version> - <opencsv.version>5.7.1</opencsv.version> - <super-csv.version>2.4.0</super-csv.version> - <jsql.version>4.6</jsql.version> - <keycloak.version>21.0.2</keycloak.version> - <hibernate.version>6.2.2.Final</hibernate.version> - <springdoc-openapi.version>2.1.0</springdoc-openapi.version> - <hsqldb.version>2.7.2</hsqldb.version> - <opensearch-client.version>1.1.0</opensearch-client.version> - <opensearch-rest-client.version>2.8.0</opensearch-rest-client.version> - <jackson.version>2.15.2</jackson.version> - </properties> - - <dependencies> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-webflux</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-amqp</artifactId> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-test</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-validation</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.cloud</groupId> - <artifactId>spring-cloud-starter-bootstrap</artifactId> - <version>${spring-cloud.version}</version> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-security</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-data-jpa</artifactId> - </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-actuator</artifactId> - </dependency> - <!-- Authentication --> - <dependency> - <groupId>org.keycloak</groupId> - <artifactId>keycloak-common</artifactId> - <version>${keycloak.version}</version> - </dependency> - <dependency> - <groupId>com.auth0</groupId> - <artifactId>java-jwt</artifactId> - <version>${jwt.version}</version> - </dependency> - <!-- Monitoring --> - <dependency> - <groupId>io.micrometer</groupId> - <artifactId>micrometer-registry-prometheus</artifactId> - <scope>runtime</scope> - </dependency> - <!-- Data Source --> - <dependency> - <groupId>org.mariadb.jdbc</groupId> - <artifactId>mariadb-java-client</artifactId> - <version>${mariadb.version}</version> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>spring-data-opensearch</artifactId> - <version>${opensearch-client.version}</version> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>spring-data-opensearch-starter</artifactId> - <version>${opensearch-client.version}</version> - </dependency> - <!-- OpenSearch --> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-core</artifactId> - <version>${jackson.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> - <version>${jackson.version}</version> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>opensearch-rest-high-level-client</artifactId> - <version>${opensearch-rest-client.version}</version> - </dependency> - <dependency> - <groupId>org.opensearch.client</groupId> - <artifactId>opensearch-rest-client-sniffer</artifactId> - <version>${opensearch-rest-client.version}</version> - </dependency> - <!-- Swagger --> - <dependency> - <groupId>org.springdoc</groupId> - <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> - <version>${springdoc-openapi.version}</version> - </dependency> - <!-- Open API --> - <dependency> - <groupId>org.springdoc</groupId> - <artifactId>springdoc-openapi-starter-webmvc-api</artifactId> - <version>${springdoc-openapi.version}</version> - </dependency> - <!-- IDE --> - <dependency> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - </dependency> - <!-- Entity, API, QueryStore --> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-db-api</artifactId> - <version>${project.version}</version> - <scope>compile</scope> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-db-entites</artifactId> - <version>${project.version}</version> - <scope>compile</scope> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>dbrepo-metadata-db-test</artifactId> - <version>${project.version}</version> - <scope>compile</scope> - </dependency> - <!-- Testing --> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - <exclusions> - <exclusion> - <groupId>org.junit.jupiter</groupId> - <artifactId>junit-vintage-engine</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.springframework.security</groupId> - <artifactId>spring-security-test</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>com.h2database</groupId> - <artifactId>h2</artifactId> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - </dependency> - <!-- Mapping --> - <dependency> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct-processor</artifactId> - <version>${mapstruct.version}</version> - <optional>true</optional> - <!-- IntelliJ --> - </dependency> - <dependency> - <groupId>org.mapstruct</groupId> - <artifactId>mapstruct</artifactId> - <version>${mapstruct.version}</version> - </dependency> - </dependencies> - - <build> - <resources> - <resource> - <directory>${basedir}/src/main/resources</directory> - <filtering>true</filtering> - <includes> - <include>**/application*.yml</include> - <include>**/templates/*.xml</include> - </includes> - </resource> - </resources> - <plugins> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - <configuration> - <excludes> - <exclude>at/tuwien/utils/**/*</exclude> - <exclude>at/tuwien/mapper/**/*</exclude> - <exclude>at/tuwien/entities/**/*</exclude> - <exclude>at/tuwien/seeder/**/*</exclude> - <exclude>at/tuwien/handlers/**/*</exclude> - <exclude>at/tuwien/exception/**/*</exclude> - <exclude>at/tuwien/config/**/*</exclude> - <exclude>at/tuwien/auth/**/*</exclude> - <exclude>**/FdaUserServiceApplication.class</exclude> - </excludes> - </configuration> - <executions> - <execution> - <id>default-prepare-agent</id> - <goals> - <goal>prepare-agent</goal> - </goals> - </execution> - <execution> - <id>report</id> - <phase>verify</phase> - <goals> - <goal>report</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-site-plugin</artifactId> - <version>3.7.1</version> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-project-info-reports-plugin</artifactId> - <version>3.0.0</version> - </plugin> - <plugin> - <groupId>com.soebes.maven.plugins</groupId> - <artifactId>doxygen-maven-plugin</artifactId> - <version>1.1.0</version> - <configuration> - <haveDot>false</haveDot> - <quiet>false</quiet> - <projectName>This is a Test Project (basicReportTest)</projectName> - <outputDirectory>docs</outputDirectory> - </configuration> - </plugin> - </plugins> - </build> - -</project> diff --git a/dbrepo-user-service/report/pom.xml b/dbrepo-user-service/report/pom.xml deleted file mode 100644 index 2555a8836e..0000000000 --- a/dbrepo-user-service/report/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <artifactId>dbrepo-user-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.3.0</version> - </parent> - - <artifactId>report</artifactId> - <version>1.3.0</version> - <name>dbrepo-user-service-report</name> - <description> - This module is only intended for the pipeline coverage report. See the detailed report in the - respective modules - </description> - - <dependencies> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>rest-service</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>services</artifactId> - <version>${project.version}</version> - </dependency> - </dependencies> - - <properties> - <jacoco.version>0.8.7</jacoco.version> - </properties> - - <build> - <plugins> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - <version>${jacoco.version}</version> - <executions> - <execution> - <id>report-aggregate</id> - <phase>verify</phase> - <goals> - <goal>report-aggregate</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/dbrepo-user-service/rest-service/pom.xml b/dbrepo-user-service/rest-service/pom.xml deleted file mode 100644 index 866460b9a9..0000000000 --- a/dbrepo-user-service/rest-service/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <artifactId>dbrepo-user-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.3.0</version> - </parent> - - <artifactId>rest-service</artifactId> - <version>1.3.0</version> - <name>dbrepo-user-service-rest</name> - - <dependencies> - <dependency> - <groupId>at.tuwien</groupId> - <artifactId>services</artifactId> - <version>${project.version}</version> - </dependency> - <dependency> - <groupId>org.jetbrains</groupId> - <artifactId>annotations</artifactId> - <version>RELEASE</version> - <scope>compile</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>repackage</goal><!-- to make it exuteable with $ java -jar ./app.jar --> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/dbrepo-user-service/rest-service/src/main/java/at/tuwien/FdaUserServiceApplication.java b/dbrepo-user-service/rest-service/src/main/java/at/tuwien/FdaUserServiceApplication.java deleted file mode 100644 index 16286483e5..0000000000 --- a/dbrepo-user-service/rest-service/src/main/java/at/tuwien/FdaUserServiceApplication.java +++ /dev/null @@ -1,27 +0,0 @@ -package at.tuwien; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration; -import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@EnableJpaAuditing -@EnableTransactionManagement -@EnableScheduling -@EntityScan(basePackages = {"at.tuwien.entities"}) -@EnableElasticsearchRepositories(basePackages = {"at.tuwien.repository.sdb"}) -@EnableJpaRepositories(basePackages = {"at.tuwien.repository.mdb"}) -@SpringBootApplication(exclude = {ElasticsearchDataAutoConfiguration.class, ElasticsearchRestClientAutoConfiguration.class}) -public class FdaUserServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(FdaUserServiceApplication.class, args); - } - -} \ No newline at end of file diff --git a/dbrepo-user-service/rest-service/src/main/java/at/tuwien/config/SwaggerConfig.java b/dbrepo-user-service/rest-service/src/main/java/at/tuwien/config/SwaggerConfig.java deleted file mode 100644 index 353d949c4b..0000000000 --- a/dbrepo-user-service/rest-service/src/main/java/at/tuwien/config/SwaggerConfig.java +++ /dev/null @@ -1,46 +0,0 @@ -package at.tuwien.config; - -import io.swagger.v3.oas.models.ExternalDocumentation; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import org.springdoc.core.models.GroupedOpenApi; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class SwaggerConfig { - - @Value("${app.version:unknown}") - private String version; - - @Bean - public OpenAPI springShopOpenAPI() { - return new OpenAPI() - .info(new Info() - .title("Database Repository User Service API") - .contact(new Contact() - .name("Prof. Andreas Rauber") - .email("andreas.rauber@tuwien.ac.at")) - .description("Service that manages the users") - .version(version) - .license(new License() - .name("Apache 2.0") - .url("https://www.apache.org/licenses/LICENSE-2.0"))) - .externalDocs(new ExternalDocumentation() - .description("Wiki Documentation") - .url("https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/wikis")); - } - - @Bean - public GroupedOpenApi publicApi() { - return GroupedOpenApi.builder() - .group("user-service") - .pathsToMatch("/api/**") - .build(); - } - -} - diff --git a/dbrepo-user-service/rest-service/src/main/java/at/tuwien/endpoint/MaintenanceEndpoint.java b/dbrepo-user-service/rest-service/src/main/java/at/tuwien/endpoint/MaintenanceEndpoint.java deleted file mode 100644 index 49fdfc37f4..0000000000 --- a/dbrepo-user-service/rest-service/src/main/java/at/tuwien/endpoint/MaintenanceEndpoint.java +++ /dev/null @@ -1,163 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.api.database.table.TableBriefDto; -import at.tuwien.api.maintenance.BannerMessageBriefDto; -import at.tuwien.api.maintenance.BannerMessageCreateDto; -import at.tuwien.api.maintenance.BannerMessageDto; -import at.tuwien.api.maintenance.BannerMessageUpdateDto; -import at.tuwien.api.user.UserBriefDto; -import at.tuwien.exception.BannerMessageNotFoundException; -import at.tuwien.mapper.BannerMessageMapper; -import at.tuwien.service.BannerMessageService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@Log4j2 -@CrossOrigin(origins = "*") -@RestController -@RequestMapping("/api/maintenance") -public class MaintenanceEndpoint { - - private final BannerMessageMapper bannerMessageMapper; - private final BannerMessageService bannerMessageService; - - @Autowired - public MaintenanceEndpoint(BannerMessageMapper bannerMessageMapper, BannerMessageService bannerMessageService) { - this.bannerMessageMapper = bannerMessageMapper; - this.bannerMessageService = bannerMessageService; - } - - @GetMapping("/message") - @Operation(summary = "Find maintenance messages") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "List messages", - content = {@Content( - mediaType = "application/json", - array = @ArraySchema(schema = @Schema(implementation = BannerMessageDto.class)))}), - }) - public ResponseEntity<List<BannerMessageDto>> list() { - log.debug("endpoint list active maintenance messages"); - final List<BannerMessageDto> dtos = bannerMessageService.findAll() - .stream() - .map(bannerMessageMapper::bannerMessageToBannerMessageDto) - .toList(); - log.trace("list maintenance messages results in dtos {}", dtos); - return ResponseEntity.ok(dtos); - } - - @GetMapping("/message/{id}") - @Operation(summary = "Find one maintenance message") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "Get messages", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = BannerMessageDto.class))}), - }) - public ResponseEntity<BannerMessageDto> find(@NotNull @PathVariable("id") Long messageId) - throws BannerMessageNotFoundException { - log.debug("endpoint find one maintenance messages"); - final BannerMessageDto dto = bannerMessageMapper.bannerMessageToBannerMessageDto(bannerMessageService.find(messageId)); - log.trace("find one maintenance message results in dto {}", dto); - return ResponseEntity.ok(dto); - } - - @GetMapping("/message/active") - @Operation(summary = "Find active maintenance messages") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "List messages", - content = {@Content( - mediaType = "application/json", - array = @ArraySchema(schema = @Schema(implementation = BannerMessageBriefDto.class)))}), - }) - public ResponseEntity<List<BannerMessageBriefDto>> active() { - log.debug("endpoint list active maintenance messages"); - final List<BannerMessageBriefDto> dtos = bannerMessageService.getActive() - .stream() - .map(bannerMessageMapper::bannerMessageToBannerMessageBriefDto) - .toList(); - log.trace("list active maintenance messages results in dtos {}", dtos); - return ResponseEntity.ok(dtos); - } - - @PostMapping("/message") - @Operation(summary = "Create maintenance message") - @PreAuthorize("hasAuthority('create-maintenance-message')") - @ApiResponses(value = { - @ApiResponse(responseCode = "201", - description = "Created message", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = BannerMessageBriefDto.class))}), - }) - public ResponseEntity<BannerMessageDto> create(@Valid @RequestBody BannerMessageCreateDto data) { - log.debug("endpoint create maintenance message, data={}", data); - final BannerMessageDto dto = bannerMessageMapper.bannerMessageToBannerMessageDto(bannerMessageService.create(data)); - log.trace("create maintenance message results in dto {}", dto); - return ResponseEntity.status(HttpStatus.CREATED) - .body(dto); - } - - @PutMapping("/message/{id}") - @Operation(summary = "Update maintenance message") - @PreAuthorize("hasAuthority('update-maintenance-message')") - @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Updated message", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = BannerMessageBriefDto.class))}), - @ApiResponse(responseCode = "404", - description = "Could not find message", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = BannerMessageNotFoundException.class))}), - }) - public ResponseEntity<BannerMessageDto> update(@NotNull @PathVariable("id") Long messageId, - @Valid @RequestBody BannerMessageUpdateDto data) - throws BannerMessageNotFoundException { - log.debug("endpoint update maintenance message, messageId={}, data={}", messageId, data); - final BannerMessageDto dto = bannerMessageMapper.bannerMessageToBannerMessageDto(bannerMessageService.update(messageId, data)); - log.trace("update maintenance message results in dto {}", dto); - return ResponseEntity.status(HttpStatus.ACCEPTED) - .body(dto); - } - - @DeleteMapping("/message/{id}") - @Operation(summary = "Delete maintenance message") - @PreAuthorize("hasAuthority('delete-maintenance-message')") - @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Deleted message", - content = {@Content(mediaType = "application/json")}), - @ApiResponse(responseCode = "404", - description = "Could not find message", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = BannerMessageNotFoundException.class))}), - }) - public ResponseEntity<?> delete(@NotNull @PathVariable("id") Long messageId) - throws BannerMessageNotFoundException { - log.debug("endpoint delete maintenance message, messageId={}", messageId); - bannerMessageService.delete(messageId); - return ResponseEntity.status(HttpStatus.ACCEPTED) - .build(); - } - -} diff --git a/dbrepo-user-service/rest-service/src/main/java/at/tuwien/endpoint/UserEndpoint.java b/dbrepo-user-service/rest-service/src/main/java/at/tuwien/endpoint/UserEndpoint.java deleted file mode 100644 index 4f7ceb9ae7..0000000000 --- a/dbrepo-user-service/rest-service/src/main/java/at/tuwien/endpoint/UserEndpoint.java +++ /dev/null @@ -1,278 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.api.auth.SignupRequestDto; -import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.api.user.*; -import at.tuwien.entities.user.Realm; -import at.tuwien.entities.user.User; -import at.tuwien.exception.*; -import at.tuwien.mapper.UserMapper; -import at.tuwien.service.RealmService; -import at.tuwien.service.UserService; -import io.micrometer.core.annotation.Timed; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.*; - -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; - -import java.security.Principal; -import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; - -@Log4j2 -@CrossOrigin(origins = "*") -@RestController -@RequestMapping("/api/user") -public class UserEndpoint { - - private final UserMapper userMapper; - private final UserService userService; - private final RealmService realmService; - - @Autowired - public UserEndpoint(UserMapper userMapper, UserService userService, RealmService realmService) { - this.userMapper = userMapper; - this.userService = userService; - this.realmService = realmService; - } - - @GetMapping - @Transactional(readOnly = true) - @Timed(value = "user.list", description = "Time needed to list all users in the metadata database") - @Operation(summary = "Find all users") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "List users", - content = {@Content( - mediaType = "application/json", - array = @ArraySchema(schema = @Schema(implementation = UserBriefDto.class)))}), - }) - public ResponseEntity<List<UserBriefDto>> findAll() { - log.debug("endpoint find all users"); - final List<UserBriefDto> users = userService.findAll() - .stream() - .map(userMapper::userToUserBriefDto) - .collect(Collectors.toList()); - log.trace("find all users resulted in users {}", users); - return ResponseEntity.ok(users); - } - - @PostMapping - @Transactional - @PreAuthorize("!isAuthenticated()") - @Timed(value = "user.create", description = "Time needed to create a user in the metadata database") - @Operation(summary = "Create user") - @ApiResponses(value = { - @ApiResponse(responseCode = "201", - description = "Created user", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = UserBriefDto.class))}), - @ApiResponse(responseCode = "404", - description = "Realm or default role not found", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "409", - description = "User with username already exists", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "417", - description = "User with e-mail already exists", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<UserBriefDto> create(@NotNull @Valid @RequestBody SignupRequestDto data) - throws RealmNotFoundException, UserAlreadyExistsException, UserEmailAlreadyExistsException { - log.debug("endpoint create a user, data={}", data); - /* check */ - final Realm realm = realmService.find("dbrepo"); - userService.validateUsernameNotExists(data.getUsername()); - userService.validateEmailNotExists(data.getEmail()); - /* create */ - final User user = userService.create(data, realm); - final UserBriefDto dto = userMapper.userToUserBriefDto(user); - log.trace("create user resulted in dto {}", dto); - return ResponseEntity.status(HttpStatus.CREATED) - .body(dto); - } - - @GetMapping("/{id}") - @Transactional - @PreAuthorize("isAuthenticated() or hasAuthority('find-user')") - @Timed(value = "user.info", description = "Time needed to get information of a user in the metadata database") - @Operation(summary = "Get a user info", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "200", - description = "Found user", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = UserDto.class))}), - @ApiResponse(responseCode = "404", - description = "User was not found", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "405", - description = "Find user is not permitted", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<UserDto> find(@NotNull @PathVariable("id") String id, - @NotNull Principal principal) - throws UserNotFoundException, NotAllowedException { - log.debug("endpoint find a user, id={}, principal={}", id, principal); - /* check */ - final User user = userService.find(UUID.fromString(id)); - final UserDto dto = userMapper.userToUserDto(user); - if (user.getUsername().equals(principal.getName())) { - log.trace("find user resulted in dto {}", dto); - return ResponseEntity.ok() - .body(dto); - } else if (User.hasRole(principal, "find-user")) { - log.trace("find user resulted in dto {}", dto); - return ResponseEntity.ok() - .body(dto); - } - log.error("Failed to find user: no authority and not the current logged-in user"); - throw new NotAllowedException("Failed to find user: no authority"); - } - - @PutMapping("/{id}") - @Transactional - @PreAuthorize("hasAuthority('modify-user-information')") - @Timed(value = "user.modify", description = "Time needed to modify a user in the metadata database") - @Operation(summary = "Modify user information", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Modified user information", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = UserDto.class))}), - @ApiResponse(responseCode = "404", - description = "User attribute was not found", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "405", - description = "Modify user is not permitted", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<UserDto> modify(@NotNull @PathVariable("id") String id, - @NotNull @Valid @RequestBody UserUpdateDto data, - @NotNull Principal principal) - throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException { - log.debug("endpoint modify a user, id={}, data={}, principal={}", id, data, principal); - /* check */ - final User user = userService.find(UUID.fromString(id)); - if (!user.equalsPrincipal(principal)) { - log.error("Failed to modify user: attempting to modify other user"); - throw new ForeignUserException("Failed to modify user: attempting to modify other user"); - } - /* modify */ - final UserDto dto = userMapper.userToUserDto(userService.modify(user.getId(), data)); - log.trace("modify user resulted in dto {}", dto); - return ResponseEntity.status(HttpStatus.ACCEPTED) - .body(dto); - } - - @PutMapping("/{id}/theme") - @Transactional - @PreAuthorize("hasAuthority('modify-user-theme')") - @Timed(value = "user.theme", description = "Time needed to modify a user theme in the metadata database") - @Operation(summary = "Modify user theme", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Modified user theme", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = UserDto.class))}), - @ApiResponse(responseCode = "404", - description = "User or user attribute was not found", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "405", - description = "Modify user is not permitted", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<UserDto> theme(@NotNull @PathVariable("id") String id, - @NotNull @Valid @RequestBody UserThemeSetDto data, - @NotNull Principal principal) - throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException { - log.debug("endpoint modify a user theme, id={}, data={}, principal={}", id, data, principal); - /* check */ - final User user = userService.find(UUID.fromString(id)); - if (!user.equalsPrincipal(principal)) { - log.error("Failed to modify user: attempting to modify other user"); - throw new ForeignUserException("Failed to modify user: attempting to modify other user"); - } - /* modify theme */ - final UserDto dto = userMapper.userToUserDto(userService.toggleTheme(user.getId(), data)); - log.trace("modify user theme resulted in dto {}", dto); - return ResponseEntity.accepted() - .body(dto); - } - - @PutMapping("/{id}/password") - @Transactional - @PreAuthorize("isAuthenticated()") - @Timed(value = "user.password", description = "Time needed to modify a user password in the metadata database") - @Operation(summary = "Modify user password", security = @SecurityRequirement(name = "bearerAuth")) - @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Modified user password", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = UserDto.class))}), - @ApiResponse(responseCode = "404", - description = "User was not found", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "405", - description = "Modify user is not permitted", - content = {@Content( - mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}), - }) - public ResponseEntity<UserDto> password(@NotNull @PathVariable("id") String id, - @NotNull @Valid @RequestBody UserPasswordDto data, - @NotNull Principal principal) - throws UserNotFoundException, ForeignUserException { - log.debug("endpoint modify a user password, id={}, data={}, principal={}", id, data, principal); - /* check */ - final User user = userService.find(UUID.fromString(id)); - if (!user.equalsPrincipal(principal)) { - log.error("Failed to modify user: attempting to modify other user"); - throw new ForeignUserException("Failed to modify user: attempting to modify other user"); - } - /* modify password */ - final UserDto dto = userMapper.userToUserDto(userService.updatePassword(user.getId(), data)); - log.trace("updated user password resulted in dto {}", dto); - return ResponseEntity.accepted() - .body(dto); - } - -} diff --git a/dbrepo-user-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java b/dbrepo-user-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java deleted file mode 100644 index 78639cb60d..0000000000 --- a/dbrepo-user-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java +++ /dev/null @@ -1,127 +0,0 @@ -package at.tuwien.handlers; - -import at.tuwien.api.error.ApiErrorDto; -import at.tuwien.exception.*; -import io.swagger.v3.oas.annotations.Hidden; -import net.sf.jsqlparser.JSQLParserException; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.context.request.WebRequest; -import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; - -@ControllerAdvice -public class ApiExceptionHandler extends ResponseEntityExceptionHandler { - - @Hidden - @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) - @ExceptionHandler(ForeignUserException.class) - public ResponseEntity<ApiErrorDto> handle(ForeignUserException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.METHOD_NOT_ALLOWED) - .message(e.getLocalizedMessage()) - .code("error.user.foreignpermission") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) - @ExceptionHandler(NotAllowedException.class) - public ResponseEntity<ApiErrorDto> handle(NotAllowedException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.METHOD_NOT_ALLOWED) - .message(e.getLocalizedMessage()) - .code("error.user.permission") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler(RealmNotFoundException.class) - public ResponseEntity<ApiErrorDto> handle(RealmNotFoundException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.NOT_FOUND) - .message(e.getLocalizedMessage()) - .code("error.user.realmnotfound") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.NO_CONTENT) - @ExceptionHandler(RemoteUnavailableException.class) - public ResponseEntity<ApiErrorDto> handle(RemoteUnavailableException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.NO_CONTENT) - .message(e.getLocalizedMessage()) - .code("error.user.remoteunavailable") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler(RoleNotFoundException.class) - public ResponseEntity<ApiErrorDto> handle(RoleNotFoundException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.NOT_FOUND) - .message(e.getLocalizedMessage()) - .code("error.user.rolenotfound") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.CONFLICT) - @ExceptionHandler(UserAlreadyExistsException.class) - public ResponseEntity<ApiErrorDto> handle(UserAlreadyExistsException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.CONFLICT) - .message(e.getLocalizedMessage()) - .code("error.user.alreadyexists") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler(UserAttributeNotFoundException.class) - public ResponseEntity<ApiErrorDto> handle(UserAttributeNotFoundException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.NOT_FOUND) - .message(e.getLocalizedMessage()) - .code("error.user.attributenotfound") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.EXPECTATION_FAILED) - @ExceptionHandler(UserEmailAlreadyExistsException.class) - public ResponseEntity<ApiErrorDto> handle(UserEmailAlreadyExistsException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.EXPECTATION_FAILED) - .message(e.getLocalizedMessage()) - .code("error.user.emailexists") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - - @Hidden - @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler(UserNotFoundException.class) - public ResponseEntity<ApiErrorDto> handle(UserNotFoundException e, WebRequest request) { - final ApiErrorDto response = ApiErrorDto.builder() - .status(HttpStatus.NOT_FOUND) - .message(e.getLocalizedMessage()) - .code("error.user.notfound") - .build(); - return new ResponseEntity<>(response, new HttpHeaders(), response.getStatus()); - } - -} diff --git a/dbrepo-user-service/rest-service/src/main/resources/application-local.yml b/dbrepo-user-service/rest-service/src/main/resources/application-local.yml deleted file mode 100644 index d207f4e24d..0000000000 --- a/dbrepo-user-service/rest-service/src/main/resources/application-local.yml +++ /dev/null @@ -1,54 +0,0 @@ -app.version: '@project.version@' -spring: - main.banner-mode: off - datasource: - url: jdbc:mariadb://localhost:3306/fda - driver-class-name: org.mariadb.jdbc.Driver - username: root - password: dbrepo - jpa: - show-sql: false - database-platform: org.hibernate.dialect.MariaDBDialect - hibernate: - search: - default: - elasticsearch: - host: localhost - ddl-auto: validate - use-new-id-generator-mappings: false - open-in-view: false - properties: - hibernate: - default_schema: fda - jdbc: - time_zone: UTC - application: - name: user-service - rabbitmq: - host: localhost - virtual-host: dbrepo - username: fda - password: fda - opensearch: - username: admin - password: admin - host: localhost - port: 9200 - protocol: http - cloud: - loadbalancer.ribbon.enabled: false -management.endpoints.web.exposure.include: health,info,prometheus -server: - port: 9098 -logging: - pattern.console: "%d %highlight(%-5level) %msg%n" - level: - root: warn - at.tuwien.: trace - org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -fda: - gateway.endpoint: http://localhost - default_role: default-researcher-roles - jwt: - issuer: http://localhost/realms/dbrepo - public_key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB \ No newline at end of file diff --git a/dbrepo-user-service/rest-service/src/main/resources/application.yml b/dbrepo-user-service/rest-service/src/main/resources/application.yml deleted file mode 100644 index ce3b0aaa7d..0000000000 --- a/dbrepo-user-service/rest-service/src/main/resources/application.yml +++ /dev/null @@ -1,69 +0,0 @@ -app.version: '@project.version@' -spring: - main.banner-mode: off - autoconfigure: - exclude: org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration, org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration - datasource: - url: "jdbc:mariadb://metadata-db:3306/${METADATA_DB}" - driver-class-name: org.mariadb.jdbc.Driver - username: "${METADATA_USERNAME}" - password: "${METADATA_PASSWORD}" - jpa: - show-sql: false - database-platform: org.hibernate.dialect.MariaDBDialect - hibernate: - search: - default: - elasticsearch: - host: search-db - ddl-auto: validate - use-new-id-generator-mappings: false - open-in-view: false - properties: - hibernate: - default_schema: "${METADATA_DB}" - jdbc: - time_zone: UTC - application: - name: user-service - rabbitmq: - host: broker-service - virtual-host: dbrepo - username: "${BROKER_USERNAME}" - password: "${BROKER_PASSWORD}" - opensearch: - username: "${SEARCH_USERNAME}" - password: "${SEARCH_PASSWORD}" - host: search-db - port: 9200 - protocol: http - cloud: - loadbalancer.ribbon.enabled: false -management: - endpoints: - web: - exposure: - include: health,info,prometheus - endpoint: - health: - probes: - enabled: true - health: - readinessState: - enabled: true - livenessState: - enabled: true -server: - port: 9098 -logging: - pattern.console: "%d %highlight(%-5level) %msg%n" - level: - root: warn - at.tuwien.: "${LOG_LEVEL}" - org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug -fda: - gateway.endpoint: "${GATEWAY_ENDPOINT}" - default_role: "${DEFAULT_ROLE}" - jwt: - issuer: "${JWT_ISSUER}" - public_key: "${JWT_PUBKEY}" \ No newline at end of file diff --git a/dbrepo-user-service/rest-service/src/main/resources/config.properties b/dbrepo-user-service/rest-service/src/main/resources/config.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dbrepo-user-service/rest-service/src/main/resources/mariadb_hibernate.cfg.xml b/dbrepo-user-service/rest-service/src/main/resources/mariadb_hibernate.cfg.xml deleted file mode 100644 index 01f90448ca..0000000000 --- a/dbrepo-user-service/rest-service/src/main/resources/mariadb_hibernate.cfg.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE hibernate-configuration PUBLIC - "-//Hibernate/Hibernate Configuration DTD 3.0//EN" - "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> -<hibernate-configuration> - <session-factory> - <property name="current_session_context_class">thread</property> - <property name="transaction.coordinator_class">jdbc</property> - <property name="c3p0.min_size">1</property> - <property name="c3p0.max_size">30</property> - <property name="c3p0.acquire_increment">1</property> - <property name="c3p0.timeout">1800</property> - <property name="show_sql">true</property> - <property name="format_sql">true</property> - <property name="hbm2ddl.auto">update</property> - <mapping class="at.tuwien.querystore.Column" /> - <mapping class="at.tuwien.querystore.Query" /> - <mapping class="at.tuwien.querystore.Table" /> - </session-factory> -</hibernate-configuration> diff --git a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java b/dbrepo-user-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java deleted file mode 100644 index c5adb93d3d..0000000000 --- a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/BaseUnitTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package at.tuwien; - -import at.tuwien.test.BaseTest; -import org.springframework.test.context.TestPropertySource; - -@TestPropertySource(locations = "classpath:application.properties") -public abstract class BaseUnitTest extends BaseTest { - -} \ No newline at end of file diff --git a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/ActuatorComponentTest.java b/dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/ActuatorComponentTest.java deleted file mode 100644 index 41c39be818..0000000000 --- a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/ActuatorComponentTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.repository.sdb.UserIdxRepository; -import com.rabbitmq.client.Channel; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@Log4j2 -@ExtendWith(SpringExtension.class) -@AutoConfigureMockMvc -@SpringBootTest -public class ActuatorComponentTest extends BaseUnitTest { - - @MockBean - private UserIdxRepository userIdxRepository; - - @Autowired - private MockMvc mockMvc; - - @MockBean - private Channel channel; - - @Test - public void actuatorInfo_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/info")) - .andDo(print()) - .andExpect(status().isOk()); - } - - @Test - public void actuatorLiveness_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/health/liveness")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.status").value("UP")); - } - - @Test - public void actuatorReadiness_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/health/readiness")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.status").value("UP")); - } - - @Test - public void actuatorPrometheus_succeeds() throws Exception { - this.mockMvc.perform(get("/actuator/prometheus")); - } - -} diff --git a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/MaintenanceEndpointUnitTest.java b/dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/MaintenanceEndpointUnitTest.java deleted file mode 100644 index 2270b2e7aa..0000000000 --- a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/MaintenanceEndpointUnitTest.java +++ /dev/null @@ -1,352 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.maintenance.BannerMessageBriefDto; -import at.tuwien.api.maintenance.BannerMessageCreateDto; -import at.tuwien.api.maintenance.BannerMessageDto; -import at.tuwien.api.maintenance.BannerMessageUpdateDto; -import at.tuwien.entities.maintenance.BannerMessage; -import at.tuwien.exception.BannerMessageNotFoundException; -import at.tuwien.repository.sdb.UserIdxRepository; -import at.tuwien.service.BannerMessageService; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.test.context.support.WithAnonymousUser; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -@Log4j2 -@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class) -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class MaintenanceEndpointUnitTest extends BaseUnitTest { - - @MockBean - private UserIdxRepository userIdxRepository; - - @MockBean - private BannerMessageService bannerMessageService; - - @Autowired - private MaintenanceEndpoint maintenanceEndpoint; - - @Test - @WithAnonymousUser - public void list_anonymous_succeeds() { - - /* test */ - list_generic(); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void list_noRole_succeeds() { - - /* test */ - list_generic(); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"list-maintenance-messages"}) - public void list_hasRole_succeeds() { - - /* test */ - list_generic(); - } - - @Test - @WithAnonymousUser - public void find_anonymous_succeeds() throws BannerMessageNotFoundException { - - /* test */ - find_generic(BANNER_MESSAGE_1_ID, BANNER_MESSAGE_1); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void find_noRole_succeeds() throws BannerMessageNotFoundException { - - /* test */ - find_generic(BANNER_MESSAGE_1_ID, BANNER_MESSAGE_1); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"find-maintenance-message"}) - public void find_hasRole_succeeds() throws BannerMessageNotFoundException { - - /* test */ - find_generic(BANNER_MESSAGE_1_ID, BANNER_MESSAGE_1); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"find-maintenance-message"}) - public void find_hasRoleNotFound_fails() { - - /* test */ - assertThrows(BannerMessageNotFoundException.class, () -> { - find_generic(BANNER_MESSAGE_1_ID, null); - }); - } - - @Test - @WithAnonymousUser - public void active_anonymous_succeeds() { - - /* test */ - active_generic(); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void active_noRole_succeeds() { - - /* test */ - active_generic(); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"list-maintenance-messages"}) - public void active_hasRole_succeeds() { - - /* test */ - active_generic(); - } - - @Test - @WithAnonymousUser - public void create_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - create_generic(BANNER_MESSAGE_1_CREATE_DTO, BANNER_MESSAGE_1); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void create_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - create_generic(BANNER_MESSAGE_1_CREATE_DTO, BANNER_MESSAGE_1); - }); - } - - @Test - @WithMockUser(username = USER_2_USERNAME, authorities = {"create-maintenance-message"}) - public void create_hasRole_succeeds() { - - /* test */ - create_generic(BANNER_MESSAGE_1_CREATE_DTO, BANNER_MESSAGE_1); - } - - @Test - @WithAnonymousUser - public void update_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - update_generic(BANNER_MESSAGE_1_UPDATE_DTO, BANNER_MESSAGE_1_ID, BANNER_MESSAGE_1); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void update_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - update_generic(BANNER_MESSAGE_1_UPDATE_DTO, BANNER_MESSAGE_1_ID, BANNER_MESSAGE_1); - }); - } - - @Test - @WithMockUser(username = USER_2_USERNAME, authorities = {"update-maintenance-message"}) - public void update_hasRole_succeeds() throws BannerMessageNotFoundException { - - /* test */ - update_generic(BANNER_MESSAGE_1_UPDATE_DTO, BANNER_MESSAGE_1_ID, BANNER_MESSAGE_1); - } - - @Test - @WithMockUser(username = USER_2_USERNAME, authorities = {"update-maintenance-message"}) - public void update_hasRoleNotFound_fails() { - - /* test */ - assertThrows(BannerMessageNotFoundException.class, () -> { - update_generic(BANNER_MESSAGE_1_UPDATE_DTO, BANNER_MESSAGE_1_ID, null); - }); - } - - @Test - @WithAnonymousUser - public void delete_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - delete_generic(BANNER_MESSAGE_1_ID, BANNER_MESSAGE_1); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void delete_noRole_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - delete_generic(BANNER_MESSAGE_1_ID, BANNER_MESSAGE_1); - }); - } - - @Test - @WithMockUser(username = USER_2_USERNAME, authorities = {"delete-maintenance-message"}) - public void delete_hasRole_succeeds() throws BannerMessageNotFoundException { - - /* test */ - delete_generic(BANNER_MESSAGE_1_ID, BANNER_MESSAGE_1); - } - - @Test - @WithMockUser(username = USER_2_USERNAME, authorities = {"delete-maintenance-message"}) - public void delete_hasRoleNotFound_fails() { - - /* test */ - assertThrows(BannerMessageNotFoundException.class, () -> { - delete_generic(BANNER_MESSAGE_1_ID, null); - }); - } - - /* ################################################################################################### */ - /* ## GENERIC TEST CASES ## */ - /* ################################################################################################### */ - - protected void list_generic() { - - /* mock */ - when(bannerMessageService.findAll()) - .thenReturn(List.of(BANNER_MESSAGE_1, BANNER_MESSAGE_2)); - - /* test */ - final ResponseEntity<List<BannerMessageDto>> response = maintenanceEndpoint.list(); - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertNotNull(response.getBody()); - final List<BannerMessageDto> body = response.getBody(); - assertEquals(2, body.size()); - final BannerMessageDto message0 = body.get(0); - assertEquals(BANNER_MESSAGE_1_ID, message0.getId()); - assertEquals(BANNER_MESSAGE_1_TYPE_DTO, message0.getType()); - assertEquals(BANNER_MESSAGE_1_MESSAGE, message0.getMessage()); - final BannerMessageDto message1 = body.get(1); - assertEquals(BANNER_MESSAGE_2_ID, message1.getId()); - assertEquals(BANNER_MESSAGE_2_TYPE_DTO, message1.getType()); - assertEquals(BANNER_MESSAGE_2_MESSAGE, message1.getMessage()); - } - - protected void find_generic(Long messageId, BannerMessage message) throws BannerMessageNotFoundException { - - /* mock */ - if (message != null) { - when(bannerMessageService.find(messageId)) - .thenReturn(message); - } else { - doThrow(BannerMessageNotFoundException.class) - .when(bannerMessageService) - .find(messageId); - } - - /* test */ - final ResponseEntity<BannerMessageDto> response = maintenanceEndpoint.find(messageId); - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertNotNull(response.getBody()); - final BannerMessageDto body = response.getBody(); - assertEquals(BANNER_MESSAGE_1_ID, body.getId()); - assertEquals(BANNER_MESSAGE_1_MESSAGE, body.getMessage()); - assertEquals(BANNER_MESSAGE_1_TYPE_DTO, body.getType()); - assertEquals(BANNER_MESSAGE_1_START, body.getDisplayStart()); - assertEquals(BANNER_MESSAGE_1_END, body.getDisplayEnd()); - } - - protected void active_generic() { - - /* mock */ - when(bannerMessageService.getActive()) - .thenReturn(List.of(BANNER_MESSAGE_1)); - - /* test */ - final ResponseEntity<List<BannerMessageBriefDto>> response = maintenanceEndpoint.active(); - assertEquals(HttpStatus.OK, response.getStatusCode()); - assertNotNull(response.getBody()); - final List<BannerMessageBriefDto> body = response.getBody(); - assertEquals(1, body.size()); - final BannerMessageBriefDto message0 = body.get(0); - assertEquals(BANNER_MESSAGE_1_TYPE_DTO, message0.getType()); - assertEquals(BANNER_MESSAGE_1_MESSAGE, message0.getMessage()); - } - - protected void create_generic(BannerMessageCreateDto data, BannerMessage message) { - - /* mock */ - when(bannerMessageService.create(data)) - .thenReturn(message); - - /* test */ - final ResponseEntity<BannerMessageDto> response = maintenanceEndpoint.create(data); - assertEquals(HttpStatus.CREATED, response.getStatusCode()); - assertNotNull(response.getBody()); - } - - protected void update_generic(BannerMessageUpdateDto data, Long messageId, BannerMessage message) - throws BannerMessageNotFoundException { - - /* mock */ - if (message != null) { - when(bannerMessageService.update(messageId, data)) - .thenReturn(message); - } else { - doThrow(BannerMessageNotFoundException.class) - .when(bannerMessageService) - .update(messageId, data); - } - - /* test */ - final ResponseEntity<BannerMessageDto> response = maintenanceEndpoint.update(messageId, data); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - assertNotNull(response.getBody()); - } - - protected void delete_generic(Long messageId, BannerMessage message) - throws BannerMessageNotFoundException { - - /* mock */ - if (message != null) { - when(bannerMessageService.find(messageId)) - .thenReturn(message); - doNothing() - .when(bannerMessageService) - .delete(messageId); - } else { - doThrow(BannerMessageNotFoundException.class) - .when(bannerMessageService) - .delete(messageId); - } - - /* test */ - final ResponseEntity<?> response = maintenanceEndpoint.delete(messageId); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - assertNull(response.getBody()); - } -} diff --git a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/SwaggerComponentTest.java b/dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/SwaggerComponentTest.java deleted file mode 100644 index 4ced37e363..0000000000 --- a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/SwaggerComponentTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.repository.sdb.UserIdxRepository; -import com.rabbitmq.client.Channel; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.web.servlet.MockMvc; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@Log4j2 -@ExtendWith(SpringExtension.class) -@AutoConfigureMockMvc -@SpringBootTest -public class SwaggerComponentTest extends BaseUnitTest { - - @MockBean - private UserIdxRepository userIdxRepository; - - @Autowired - private MockMvc mockMvc; - - @MockBean - private Channel channel; - - @Test - public void swaggerUi_succeeds() throws Exception { - this.mockMvc.perform(get("/swagger-ui/index.html")) - .andDo(print()) - .andExpect(status().isOk()); - } - -} diff --git a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/UserEndpointUnitTest.java b/dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/UserEndpointUnitTest.java deleted file mode 100644 index 572ad17769..0000000000 --- a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/endpoint/UserEndpointUnitTest.java +++ /dev/null @@ -1,444 +0,0 @@ -package at.tuwien.endpoint; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.auth.SignupRequestDto; -import at.tuwien.api.user.*; -import at.tuwien.entities.user.Realm; -import at.tuwien.entities.user.Role; -import at.tuwien.entities.user.User; -import at.tuwien.exception.*; -import at.tuwien.repository.sdb.UserIdxRepository; -import at.tuwien.service.RealmService; -import at.tuwien.service.RoleService; -import at.tuwien.service.UserService; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.test.context.support.WithAnonymousUser; -import org.springframework.security.test.context.support.WithMockUser; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.security.Principal; -import java.util.List; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -@Log4j2 -@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class) -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class UserEndpointUnitTest extends BaseUnitTest { - - @MockBean - private UserIdxRepository userIdxRepository; - - @MockBean - private UserService userService; - - @MockBean - private RealmService realmService; - - @MockBean - private RoleService roleService; - - @Autowired - private UserEndpoint userEndpoint; - - @Test - @WithAnonymousUser - public void findAll_anonymous_succeeds() { - - /* test */ - findAll_generic(); - } - - @Test - @WithMockUser(username = USER_1_USERNAME) - public void findAll_noRole_succeeds() { - - /* test */ - findAll_generic(); - } - - @Test - @WithAnonymousUser - public void create_anonymous_succeeds() throws UserNotFoundException, UserEmailAlreadyExistsException, - RealmNotFoundException, RoleNotFoundException, RemoteUnavailableException, UserAlreadyExistsException { - final SignupRequestDto request = SignupRequestDto.builder() - .email(USER_1_EMAIL) - .username(USER_1_USERNAME) - .password(USER_1_PASSWORD) - .build(); - - /* test */ - create_generic(USER_1, REALM_DBREPO, ROLE_DEFAULT_RESEARCHER_ROLES, request); - } - - @Test - @WithAnonymousUser - public void create_realmNotFound_fails() { - final SignupRequestDto request = SignupRequestDto.builder() - .email(USER_1_EMAIL) - .username(USER_1_USERNAME) - .password(USER_1_PASSWORD) - .build(); - - /* test */ - assertThrows(RealmNotFoundException.class, () -> { - create_generic(USER_1, null, ROLE_DEFAULT_RESEARCHER_ROLES, request); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME) - public void create_isAuthenticated_fails() { - final SignupRequestDto request = SignupRequestDto.builder() - .email(USER_2_EMAIL) - .username(USER_2_USERNAME) - .password(USER_2_PASSWORD) - .build(); - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - create_generic(USER_2, REALM_DBREPO, ROLE_DEFAULT_RESEARCHER_ROLES, request); - }); - } - - @Test - @WithAnonymousUser - public void find_anonymous_fails() { - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - find_generic(USER_1_ID.toString(), USER_1, null); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME) - public void find_self_succeeds() throws UserNotFoundException, NotAllowedException { - - /* test */ - find_generic(USER_1_ID.toString(), USER_1, USER_1_PRINCIPAL); - } - - @Test - @WithMockUser(username = USER_1_USERNAME) - public void find_foreign_fails() { - - /* test */ - assertThrows(NotAllowedException.class, () -> { - find_generic(USER_2_ID.toString(), USER_2, USER_1_PRINCIPAL); - }); - } - - @Test - @WithMockUser(username = USER_3_USERNAME, authorities = {"find-user"}) - public void find_hasRoleForeign_succeeds() { - - /* test */ - assertThrows(NotAllowedException.class, () -> { - find_generic(USER_2_ID.toString(), USER_2, USER_3_PRINCIPAL); - }); - } - - @Test - @WithAnonymousUser - public void modify_anonymous_fails() { - final UserUpdateDto request = UserUpdateDto.builder() - .firstname(USER_1_FIRSTNAME) - .lastname(USER_1_LASTNAME) - .affiliation(USER_1_AFFILIATION) - .orcid(USER_1_ORCID) - .build(); - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - modify_generic(USER_1_ID.toString(), USER_1, null, request); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void modify_noRole_fails() { - final UserUpdateDto request = UserUpdateDto.builder() - .firstname(USER_1_FIRSTNAME) - .lastname(USER_1_LASTNAME) - .affiliation(USER_1_AFFILIATION) - .orcid(USER_1_ORCID) - .build(); - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - modify_generic(USER_1_ID.toString(), USER_1, USER_4_PRINCIPAL, request); - }); - } - - @Test - @WithMockUser(username = USER_2_USERNAME, authorities = {"modify-user-information"}) - public void modify_hasRoleForeign_fails() { - final UserUpdateDto request = UserUpdateDto.builder() - .firstname(USER_1_FIRSTNAME) - .lastname(USER_1_LASTNAME) - .affiliation(USER_1_AFFILIATION) - .orcid(USER_1_ORCID) - .build(); - - /* test */ - assertThrows(ForeignUserException.class, () -> { - modify_generic(USER_1_ID.toString(), USER_1, USER_2_PRINCIPAL, request); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-user-information"}) - public void modify_succeeds() throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException { - final UserUpdateDto request = UserUpdateDto.builder() - .firstname(USER_1_FIRSTNAME) - .lastname(USER_1_LASTNAME) - .affiliation(USER_1_AFFILIATION) - .orcid(USER_1_ORCID) - .build(); - - /* test */ - modify_generic(USER_1_ID.toString(), USER_1, USER_1_PRINCIPAL, request); - } - - @Test - @WithAnonymousUser - public void theme_anonymous_fails() { - final UserThemeSetDto request = UserThemeSetDto.builder() - .themeDark(USER_1_THEME_DARK) - .build(); - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - theme_generic(USER_1_ID.toString(), USER_1, null, request); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void theme_noRole_fails() { - final UserThemeSetDto request = UserThemeSetDto.builder() - .themeDark(USER_1_THEME_DARK) - .build(); - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - theme_generic(USER_4_ID.toString(), USER_4, USER_4_PRINCIPAL, request); - }); - } - - @Test - @WithMockUser(username = USER_2_USERNAME, authorities = {"modify-user-theme"}) - public void theme_hasRoleForeign_fails() { - final UserThemeSetDto request = UserThemeSetDto.builder() - .themeDark(USER_1_THEME_DARK) - .build(); - - /* test */ - assertThrows(ForeignUserException.class, () -> { - theme_generic(USER_1_ID.toString(), USER_1, USER_2_PRINCIPAL, request); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-user-theme"}) - public void theme_succeeds() throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException { - final UserThemeSetDto request = UserThemeSetDto.builder() - .themeDark(USER_1_THEME_DARK) - .build(); - - /* test */ - theme_generic(USER_1_ID.toString(), USER_1, USER_1_PRINCIPAL, request); - } - - @Test - @WithAnonymousUser - public void password_anonymous_fails() { - final UserPasswordDto request = UserPasswordDto.builder() - .password(USER_1_PASSWORD) - .build(); - - /* test */ - assertThrows(AccessDeniedException.class, () -> { - password_generic(USER_1_ID.toString(), USER_1, null, request); - }); - } - - @Test - @WithMockUser(username = USER_4_USERNAME) - public void password_noRoleForeign_fails() { - final UserPasswordDto request = UserPasswordDto.builder() - .password(USER_1_PASSWORD) - .build(); - - /* test */ - assertThrows(ForeignUserException.class, () -> { - password_generic(USER_1_ID.toString(), USER_1, USER_4_PRINCIPAL, request); - }); - } - - @Test - @WithMockUser(username = USER_1_USERNAME) - public void password_succeeds() throws UserNotFoundException, ForeignUserException { - final UserPasswordDto request = UserPasswordDto.builder() - .password(USER_1_PASSWORD) - .build(); - - /* test */ - password_generic(USER_1_ID.toString(), USER_1, USER_1_PRINCIPAL, request); - } - - /* ################################################################################################### */ - /* ## GENERIC TEST CASES ## */ - /* ################################################################################################### */ - - protected void findAll_generic() { - - /* mock */ - when(userService.findAll()) - .thenReturn(List.of(USER_1, USER_2)); - - /* test */ - final ResponseEntity<List<UserBriefDto>> response = userEndpoint.findAll(); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final List<UserBriefDto> body = response.getBody(); - assertNotNull(body); - assertEquals(2, body.size()); - } - - protected void create_generic(User user, Realm realm, Role role, SignupRequestDto data) - throws UserEmailAlreadyExistsException, RealmNotFoundException, RoleNotFoundException, - UserAlreadyExistsException { - - /* mock */ - if (realm != null) { - when(realmService.find(REALM_DBREPO_NAME)) - .thenReturn(realm); - } else { - doThrow(RealmNotFoundException.class) - .when(realmService) - .find(REALM_DBREPO_NAME); - } - if (role != null) { - when(roleService.find(ROLE_DEFAULT_RESEARCHER_ROLES_NAME)) - .thenReturn(role); - } else { - doThrow(RoleNotFoundException.class) - .when(roleService) - .find(ROLE_DEFAULT_REALM_DBREPO_ROLES_NAME); - } - if (user != null) { - when(userService.create(data, realm)) - .thenReturn(user); - } else { - doThrow(UserNotFoundException.class) - .when(userService) - .create(data, realm); - } - - /* test */ - final ResponseEntity<UserBriefDto> response = userEndpoint.create(data); - assertEquals(HttpStatus.CREATED, response.getStatusCode()); - final UserBriefDto body = response.getBody(); - assertNotNull(body); - } - - protected void find_generic(String id, User user, Principal principal) throws UserNotFoundException, - NotAllowedException { - - /* mock */ - if (user != null) { - when(userService.find(UUID.fromString(id))) - .thenReturn(user); - } else { - doThrow(UserNotFoundException.class) - .when(userService) - .find(UUID.fromString(id)); - } - - /* test */ - final ResponseEntity<UserDto> response = userEndpoint.find(id, principal); - assertEquals(HttpStatus.OK, response.getStatusCode()); - final UserDto body = response.getBody(); - assertNotNull(body); - } - - protected void modify_generic(String id, User user, Principal principal, UserUpdateDto data) - throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException { - - /* mock */ - if (user != null) { - when(userService.find(UUID.fromString(id))) - .thenReturn(user); - } else { - doThrow(UserNotFoundException.class) - .when(userService) - .find(UUID.fromString(id)); - } - when(userService.modify(UUID.fromString(id), data)) - .thenReturn(user); - - /* test */ - final ResponseEntity<UserDto> response = userEndpoint.modify(id, data, principal); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - final UserDto body = response.getBody(); - assertNotNull(body); - } - - protected void theme_generic(String id, User user, Principal principal, UserThemeSetDto data) - throws UserNotFoundException, ForeignUserException, UserAttributeNotFoundException { - - /* mock */ - if (user != null) { - when(userService.find(UUID.fromString(id))) - .thenReturn(user); - } else { - doThrow(UserNotFoundException.class) - .when(userService) - .find(UUID.fromString(id)); - } - when(userService.toggleTheme(UUID.fromString(id), data)) - .thenReturn(user); - - /* test */ - final ResponseEntity<UserDto> response = userEndpoint.theme(id, data, principal); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - final UserDto body = response.getBody(); - assertNotNull(body); - } - - protected void password_generic(String id, User user, Principal principal, UserPasswordDto data) - throws UserNotFoundException, ForeignUserException { - - /* mock */ - if (user != null) { - when(userService.find(UUID.fromString(id))) - .thenReturn(user); - } else { - doThrow(UserNotFoundException.class) - .when(userService) - .find(UUID.fromString(id)); - } - when(userService.updatePassword(UUID.fromString(id), data)) - .thenReturn(user); - - /* test */ - final ResponseEntity<UserDto> response = userEndpoint.password(id, data, principal); - assertEquals(HttpStatus.ACCEPTED, response.getStatusCode()); - final UserDto body = response.getBody(); - assertNotNull(body); - } -} diff --git a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/mapper/UserMapperTest.java b/dbrepo-user-service/rest-service/src/test/java/at/tuwien/mapper/UserMapperTest.java deleted file mode 100644 index 9cabbafa84..0000000000 --- a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/mapper/UserMapperTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package at.tuwien.mapper; - -import at.tuwien.BaseUnitTest; -import at.tuwien.entities.user.User; -import at.tuwien.repository.sdb.UserIdxRepository; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; - -@Log4j2 -@SpringBootTest -public class UserMapperTest extends BaseUnitTest { - - @MockBean - private UserIdxRepository userIdxRepository; - - @Test - public void equals_fails() { - - /* test */ - assertNotEquals(USER_1, USER_2); - } - - @Test - public void equals_identity_succeeds() { - - /* test */ - assertEquals(USER_1, USER_1); - } - - @Test - public void equals_similar_succeeds() { - final User tmp = User.builder() - .id(USER_1_ID) - .build(); - - /* test */ - assertEquals(USER_1, tmp); - } - -} diff --git a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/BannerMessageServiceIntegrationTest.java b/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/BannerMessageServiceIntegrationTest.java deleted file mode 100644 index 132257159b..0000000000 --- a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/BannerMessageServiceIntegrationTest.java +++ /dev/null @@ -1,143 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.maintenance.BannerMessageCreateDto; -import at.tuwien.api.maintenance.BannerMessageTypeDto; -import at.tuwien.api.maintenance.BannerMessageUpdateDto; -import at.tuwien.entities.maintenance.BannerMessage; -import at.tuwien.entities.maintenance.BannerMessageType; -import at.tuwien.exception.BannerMessageNotFoundException; -import at.tuwien.repository.mdb.BannerMessageRepository; -import at.tuwien.repository.sdb.UserIdxRepository; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -@Log4j2 -@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class) -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class BannerMessageServiceIntegrationTest extends BaseUnitTest { - - @MockBean - private UserIdxRepository userIdxRepository; - - @Autowired - private BannerMessageRepository bannerMessageRepository; - - @Autowired - private BannerMessageService bannerMessageService; - - @BeforeEach - public void beforeEach() { - bannerMessageRepository.save(BANNER_MESSAGE_1); - bannerMessageRepository.save(BANNER_MESSAGE_2); - } - - @Test - public void findAll_succeeds() { - - /* test */ - final List<BannerMessage> response = bannerMessageService.findAll(); - assertEquals(2, response.size()); - } - - @Test - public void getActive_succeeds() { - - /* test */ - final List<BannerMessage> response = bannerMessageService.getActive(); - assertEquals(1, response.size()); - final BannerMessage message0 = response.get(0); - assertEquals(BANNER_MESSAGE_1_ID, message0.getId()); - assertEquals(BANNER_MESSAGE_1_MESSAGE, message0.getMessage()); - assertEquals(BANNER_MESSAGE_1_TYPE, message0.getType()); - } - - @Test - public void find_succeeds() throws BannerMessageNotFoundException { - - /* test */ - final BannerMessage response = bannerMessageService.find(BANNER_MESSAGE_1_ID); - assertEquals(BANNER_MESSAGE_1_ID, response.getId()); - assertEquals(BANNER_MESSAGE_1_MESSAGE, response.getMessage()); - assertEquals(BANNER_MESSAGE_1_TYPE, response.getType()); - } - - @Test - public void find_notFound_fails() { - - /* test */ - assertThrows(BannerMessageNotFoundException.class, () -> { - bannerMessageService.find(9999L); - }); - } - - @Test - public void create_succeeds() { - final BannerMessageCreateDto request = BannerMessageCreateDto.builder() - .message("test") - .type(BannerMessageTypeDto.INFO) - .build(); - - /* test */ - final BannerMessage response = bannerMessageService.create(request); - assertEquals("test", response.getMessage()); - assertEquals(BannerMessageType.INFO, response.getType()); - } - - @Test - public void update_succeeds() throws BannerMessageNotFoundException { - final BannerMessageUpdateDto request = BannerMessageUpdateDto.builder() - .message("test") - .type(BannerMessageTypeDto.INFO) - .build(); - - /* test */ - final BannerMessage response = bannerMessageService.update(BANNER_MESSAGE_1_ID, request); - assertEquals("test", response.getMessage()); - assertEquals(BannerMessageType.INFO, response.getType()); - } - - @Test - public void update_notFound_fails() { - final BannerMessageUpdateDto request = BannerMessageUpdateDto.builder() - .message("test") - .type(BannerMessageTypeDto.INFO) - .build(); - - /* test */ - assertThrows(BannerMessageNotFoundException.class, () -> { - bannerMessageService.update(9999L, request); - }); - } - - @Test - public void delete_succeeds() throws BannerMessageNotFoundException { - - /* test */ - bannerMessageService.delete(BANNER_MESSAGE_1_ID); - } - - @Test - public void delete_notFound_fails() { - - /* test */ - assertThrows(BannerMessageNotFoundException.class, () -> { - bannerMessageService.delete(9999L); - }); - } -} diff --git a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/RealmServiceIntegrationTest.java b/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/RealmServiceIntegrationTest.java deleted file mode 100644 index f4a00ba858..0000000000 --- a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/RealmServiceIntegrationTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.entities.user.Realm; -import at.tuwien.exception.RealmNotFoundException; -import at.tuwien.repository.mdb.RealmRepository; -import at.tuwien.repository.sdb.UserIdxRepository; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import static org.junit.jupiter.api.Assertions.*; - -@Log4j2 -@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class) -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class RealmServiceIntegrationTest extends BaseUnitTest { - - @MockBean - private UserIdxRepository userIdxRepository; - - @Autowired - private RealmRepository realmRepository; - - @Autowired - private RealmService realmService; - - @BeforeEach - public void beforeEach() { - realmRepository.save(REALM_DBREPO); - } - - @Test - public void find_succeeds() throws RealmNotFoundException { - - /* test */ - final Realm response = realmService.find(REALM_DBREPO_NAME); - assertNotNull(response); - assertEquals(REALM_DBREPO_ID, response.getId()); - assertEquals(REALM_DBREPO_NAME, response.getName()); - assertEquals(REALM_DBREPO_ENABLED, response.getEnabled()); - } - - @Test - public void find_fails() { - - /* test */ - assertThrows(RealmNotFoundException.class, () -> { - realmService.find("shadow"); - }); - } -} diff --git a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/RoleServiceIntegrationTest.java b/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/RoleServiceIntegrationTest.java deleted file mode 100644 index 1fb85f7b76..0000000000 --- a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/RoleServiceIntegrationTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.entities.user.Role; -import at.tuwien.exception.RoleNotFoundException; -import at.tuwien.repository.mdb.RoleRepository; -import at.tuwien.repository.mdb.UserRepository; -import at.tuwien.repository.sdb.UserIdxRepository; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import static org.junit.jupiter.api.Assertions.*; - -@Log4j2 -@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class) -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class RoleServiceIntegrationTest extends BaseUnitTest { - - @MockBean - private UserIdxRepository userIdxRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private RoleRepository roleRepository; - - @Autowired - private RoleService roleService; - - @BeforeEach - public void beforeEach() { - userRepository.save(USER_1_SIMPLE); - roleRepository.save(ROLE_DEFAULT_RESEARCHER_ROLES); - } - - @Test - public void find_succeeds() throws RoleNotFoundException { - - /* test */ - final Role response = roleService.find(ROLE_DEFAULT_RESEARCHER_ROLES_NAME); - assertNotNull(response); - assertEquals(ROLE_DEFAULT_RESEARCHER_ROLES_ID, response.getId()); - assertEquals(ROLE_DEFAULT_RESEARCHER_ROLES_NAME, response.getName()); - } - - @Test - public void find_fails() { - - /* test */ - assertThrows(RoleNotFoundException.class, () -> { - roleService.find("1role2rulethemall"); - }); - } -} diff --git a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/UserAttributeServiceIntegrationTest.java b/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/UserAttributeServiceIntegrationTest.java deleted file mode 100644 index 7ac8f6b527..0000000000 --- a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/UserAttributeServiceIntegrationTest.java +++ /dev/null @@ -1,102 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.entities.user.UserAttribute; -import at.tuwien.exception.UserAttributeNotFoundException; -import at.tuwien.repository.mdb.UserAttributeRepository; -import at.tuwien.repository.mdb.UserRepository; -import at.tuwien.repository.sdb.UserIdxRepository; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.*; - -@Log4j2 -@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class) -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class UserAttributeServiceIntegrationTest extends BaseUnitTest { - - @MockBean - private UserIdxRepository userIdxRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private UserAttributeRepository userAttributeRepository; - - @Autowired - private UserAttributeService userAttributeService; - - @BeforeEach - public void beforeEach() { - userRepository.save(USER_1_SIMPLE); - userAttributeRepository.saveAll(USER_1_ATTRIBUTES); - userRepository.save(USER_2_SIMPLE); - } - - @Test - public void find_succeeds() throws UserAttributeNotFoundException { - - /* test */ - final UserAttribute response = userAttributeService.find(USER_1_ID, "theme_dark"); - assertNotNull(response); - } - - @Test - public void find_fails() { - - /* test */ - assertThrows(UserAttributeNotFoundException.class, () -> { - userAttributeService.find(USER_2_ID, "theme_dark"); - }); - } - - @Test - public void create_succeeds() { - final UserAttribute request = UserAttribute.builder() - .id(UUID.randomUUID()) - .userId(USER_2_ID) - .name("debug") - .value("yes") - .build(); - - /* test */ - final UserAttribute response = userAttributeService.create(request); - assertNotNull(response); - assertEquals("debug", response.getName()); - assertEquals("yes", response.getValue()); - } - - @Test - public void update_succeeds() throws UserAttributeNotFoundException { - - /* test */ - final UserAttribute response = userAttributeService.update(USER_1_ID, "affiliation", "NASA"); - assertNotNull(response); - assertEquals("affiliation", response.getName()); - assertEquals("NASA", response.getValue()); - } - - @Test - public void update_fails() { - - /* test */ - assertThrows(UserAttributeNotFoundException.class, () -> { - userAttributeService.update(USER_2_ID, "affiliation", "NASA"); - }); - } -} diff --git a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java b/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java deleted file mode 100644 index d3f4219416..0000000000 --- a/dbrepo-user-service/rest-service/src/test/java/at/tuwien/service/UserServiceIntegrationTest.java +++ /dev/null @@ -1,247 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.BaseUnitTest; -import at.tuwien.api.auth.SignupRequestDto; -import at.tuwien.api.user.UserPasswordDto; -import at.tuwien.api.user.UserThemeSetDto; -import at.tuwien.api.user.UserUpdateDto; -import at.tuwien.entities.user.User; -import at.tuwien.entities.user.UserAttribute; -import at.tuwien.exception.*; -import at.tuwien.repository.mdb.RealmRepository; -import at.tuwien.repository.mdb.RoleRepository; -import at.tuwien.repository.mdb.UserRepository; -import at.tuwien.repository.sdb.UserIdxRepository; -import lombok.extern.log4j.Log4j2; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.*; - -@Log4j2 -@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class) -@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) -@SpringBootTest -@ExtendWith(SpringExtension.class) -public class UserServiceIntegrationTest extends BaseUnitTest { - - @MockBean - private UserIdxRepository userIdxRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private RealmRepository realmRepository; - - @Autowired - private RoleRepository roleRepository; - - @Autowired - private UserService userService; - - @BeforeEach - public void beforeEach() { - realmRepository.save(REALM_DBREPO); - userRepository.save(USER_1); - roleRepository.save(ROLE_DEFAULT_RESEARCHER_ROLES); - } - - @Test - public void findAll_succeeds() { - - /* test */ - final List<User> response = userService.findAll(); - assertEquals(1, response.size()); - } - - @Test - public void create_succeeds() throws UserAlreadyExistsException { - final SignupRequestDto request = SignupRequestDto.builder() - .username(USER_2_USERNAME) - .password(USER_2_PASSWORD) - .email(USER_2_EMAIL) - .build(); - - /* test */ - final User response = userService.create(request, REALM_DBREPO); - assertEquals(0, response.getRoles().size()); - } - - @Test - public void create_nonUniqueUsername_fails() { - final SignupRequestDto request = SignupRequestDto.builder() - .username(USER_1_USERNAME) - .password(USER_2_PASSWORD) - .email(USER_2_EMAIL) - .build(); - - /* test */ - assertThrows(DataIntegrityViolationException.class, () -> { - userService.create(request, REALM_DBREPO); - }); - } - - @Test - public void create_nonUniqueEmail_fails() { - final SignupRequestDto request = SignupRequestDto.builder() - .username(USER_2_USERNAME) - .password(USER_2_PASSWORD) - .email(USER_1_EMAIL) - .build(); - - /* test */ - assertThrows(DataIntegrityViolationException.class, () -> { - userService.create(request, REALM_DBREPO); - }); - } - - @Test - @Transactional - public void modify_succeeds() throws UserNotFoundException, UserAttributeNotFoundException { - final UserUpdateDto request = UserUpdateDto.builder() - .firstname(USER_1_FIRSTNAME) - .lastname(USER_1_LASTNAME) - .affiliation("NASA") - .orcid(null) - .build(); - - /* test */ - final User response = userService.modify(USER_1_ID, request); - assertEquals(USER_1_ID, response.getId()); - assertEquals(USER_1_FIRSTNAME, response.getFirstname()); - assertEquals(USER_1_LASTNAME, response.getLastname()); - assertEquals(3, response.getAttributes().size()); - final Optional<UserAttribute> affiliation = response.getAttributes().stream().filter(a -> a.getName().equals("affiliation")).findFirst(); - assertTrue(affiliation.isPresent()); - assertEquals("NASA", affiliation.get().getValue()); - final Optional<UserAttribute> orcid = response.getAttributes().stream().filter(a -> a.getName().equals("orcid")).findFirst(); - assertTrue(orcid.isPresent()); - assertNull(orcid.get().getValue()); - } - - @Test - public void modify_notFound_fails() { - final UserUpdateDto request = UserUpdateDto.builder() - .firstname(USER_2_FIRSTNAME) - .lastname(USER_2_LASTNAME) - .affiliation(USER_2_AFFILIATION) - .orcid(USER_2_ORCID) - .build(); - - /* test */ - assertThrows(UserNotFoundException.class, () -> { - userService.modify(USER_2_ID, request); - }); - } - - @Test - public void updatePassword_succeeds() throws UserNotFoundException { - final UserPasswordDto request = UserPasswordDto.builder() - .password(USER_1_PASSWORD) - .build(); - - /* test */ - final User response = userService.updatePassword(USER_1_ID, request); - assertEquals(1, response.getCredentials().size()); - } - - @Test - public void updatePassword_notFound_fails() { - final UserPasswordDto request = UserPasswordDto.builder() - .password(USER_1_PASSWORD) - .build(); - - /* test */ - assertThrows(UserNotFoundException.class, () -> { - userService.updatePassword(USER_2_ID, request); - }); - } - - @Test - @Transactional - public void toggleTheme_succeeds() throws UserNotFoundException, UserAttributeNotFoundException { - final UserThemeSetDto request = UserThemeSetDto.builder() - .themeDark(true) - .build(); - - /* test */ - final User response = userService.toggleTheme(USER_1_ID, request); - assertNotNull(response.getAttributes()); - assertEquals(3, response.getAttributes().size()); - } - - @Test - public void toggleTheme_fails() { - final UserThemeSetDto request = UserThemeSetDto.builder() - .themeDark(true) - .build(); - - /* test */ - assertThrows(UserNotFoundException.class, () -> { - userService.toggleTheme(USER_2_ID, request); - }); - } - - @Test - public void find_succeeds() throws UserNotFoundException { - - /* test */ - final User user = userService.find(USER_1_ID); - assertEquals(USER_1_ID, user.getId()); - } - - @Test - public void find_notFound_fails() { - - /* test */ - assertThrows(UserNotFoundException.class, () -> { - userService.find(USER_2_ID); - }); - } - - @Test - public void validateUsernameNotExists_succeeds() throws UserAlreadyExistsException { - - /* test */ - userService.validateUsernameNotExists(USER_2_USERNAME); - } - - @Test - public void validateUsernameNotExists_fails() { - - /* test */ - assertThrows(UserAlreadyExistsException.class, () -> { - userService.validateUsernameNotExists(USER_1_USERNAME); - }); - } - - @Test - public void validateEmailNotExists_succeeds() throws UserEmailAlreadyExistsException { - - /* test */ - userService.validateEmailNotExists(USER_2_EMAIL); - } - - @Test - public void validateEmailNotExists_fails() { - - /* test */ - assertThrows(UserEmailAlreadyExistsException.class, () -> { - userService.validateEmailNotExists(USER_1_EMAIL); - }); - } -} diff --git a/dbrepo-user-service/rest-service/src/test/resources/application.properties b/dbrepo-user-service/rest-service/src/test/resources/application.properties deleted file mode 100644 index a4240a2231..0000000000 --- a/dbrepo-user-service/rest-service/src/test/resources/application.properties +++ /dev/null @@ -1,30 +0,0 @@ -# enable local spring profile -spring.profiles.active=local - -# disable discovery -spring.cloud.discovery.enabled=false - -# disable cloud config and config discovery -spring.cloud.config.discovery.enabled=false -spring.cloud.config.enabled=false - -# internal datasource -spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS FDA;NON_KEYWORDS=value -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password=password -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect -spring.sql.init.mode=always -spring.sql.init.schema-locations=classpath*:init/schema.sql -spring.jpa.hibernate.ddl-auto=create - -# additional logging -logging.level.root=error -logging.level.at.tuwien.=trace -logging.level.org.hibernate.SQL=debug -logging.level.org.hibernate.type=trace - -# search service -fda.consumers=2 -fda.gateway.endpoint: http://localhost:15672 -fda.elastic.endpoint=dbrepo-search-db:9200 \ No newline at end of file diff --git a/dbrepo-user-service/rest-service/src/test/resources/init/schema.sql b/dbrepo-user-service/rest-service/src/test/resources/init/schema.sql deleted file mode 100644 index f8482e47d5..0000000000 --- a/dbrepo-user-service/rest-service/src/test/resources/init/schema.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE SCHEMA IF NOT EXISTS fda; \ No newline at end of file diff --git a/dbrepo-user-service/services/pom.xml b/dbrepo-user-service/services/pom.xml deleted file mode 100644 index 606fcdf708..0000000000 --- a/dbrepo-user-service/services/pom.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <artifactId>dbrepo-user-service</artifactId> - <groupId>at.tuwien</groupId> - <version>1.3.0</version> - </parent> - - <artifactId>services</artifactId> - <version>1.3.0</version> - <name>dbrepo-user-service-services</name> - -</project> diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/auth/AuthTokenFilter.java b/dbrepo-user-service/services/src/main/java/at/tuwien/auth/AuthTokenFilter.java deleted file mode 100644 index 92b60f4f8a..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/auth/AuthTokenFilter.java +++ /dev/null @@ -1,100 +0,0 @@ -package at.tuwien.auth; - -import at.tuwien.api.auth.RealmAccessDto; -import at.tuwien.api.user.UserDetailsDto; -import com.auth0.jwt.JWT; -import com.auth0.jwt.JWTVerifier; -import com.auth0.jwt.algorithms.Algorithm; -import com.auth0.jwt.interfaces.DecodedJWT; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.util.StringUtils; -import org.springframework.web.filter.OncePerRequestFilter; - -import java.io.IOException; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.interfaces.RSAPublicKey; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.X509EncodedKeySpec; -import java.util.Arrays; -import java.util.Base64; -import java.util.stream.Collectors; - -@Slf4j -public class AuthTokenFilter extends OncePerRequestFilter { - - @Value("${fda.jwt.issuer}") - private String issuer; - - @Value("${fda.jwt.public_key}") - private String publicKey; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { - final String jwt = parseJwt(request); - if (jwt != null) { - final UserDetails userDetails = verifyJwt(jwt); - log.debug("authenticated user {}", userDetails); - final UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( - userDetails, null, userDetails.getAuthorities()); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - - SecurityContextHolder.getContext().setAuthentication(authentication); - } - filterChain.doFilter(request, response); - } - - public UserDetails verifyJwt(String token) throws ServletException { - final KeyFactory kf; - try { - kf = KeyFactory.getInstance("RSA"); - } catch (NoSuchAlgorithmException e) { - log.error("Failed to find RSA algorithm"); - throw new ServletException("Failed to find RSA algorithm", e); - } - final X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)); - final RSAPublicKey pubKey; - try { - pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509); - } catch (InvalidKeySpecException e) { - log.error("Provided public key is invalid"); - throw new ServletException("Provided public key is invalid", e); - } - final Algorithm algorithm = Algorithm.RSA256(pubKey, null); - JWTVerifier verifier = JWT.require(algorithm) - .withIssuer(issuer) - .withAudience("spring") - .build(); - final DecodedJWT jwt = verifier.verify(token); - final RealmAccessDto realmAccess = jwt.getClaim("realm_access").as(RealmAccessDto.class); - return UserDetailsDto.builder() - .username(jwt.getClaim("client_id").asString()) - .authorities(Arrays.stream(realmAccess.getRoles()).map(SimpleGrantedAuthority::new).collect(Collectors.toList())) - .build(); - } - - /** - * Parses the token from the HTTP header of the request - * - * @param request The request. - * @return The token. - */ - public String parseJwt(HttpServletRequest request) { - String headerAuth = request.getHeader("Authorization"); - if (StringUtils.hasText(headerAuth) && headerAuth.startsWith("Bearer ")) { - return headerAuth.substring(7, headerAuth.length()); - } - return null; - } -} \ No newline at end of file diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/config/GatewayConfig.java b/dbrepo-user-service/services/src/main/java/at/tuwien/config/GatewayConfig.java deleted file mode 100644 index 084171253f..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/config/GatewayConfig.java +++ /dev/null @@ -1,49 +0,0 @@ -package at.tuwien.config; - -import at.tuwien.mapper.AuthenticationMapper; -import lombok.Getter; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.support.BasicAuthenticationInterceptor; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.DefaultUriBuilderFactory; - -@Getter -@Configuration -public class GatewayConfig { - - @Value("${fda.gateway.endpoint}") - private String gatewayEndpoint; - - @Value("${spring.rabbitmq.username}") - private String brokerUsername; - - @Value("${spring.rabbitmq.password}") - private String brokerPassword; - - private final AuthenticationMapper authenticationMapper; - - @Autowired - public GatewayConfig(AuthenticationMapper authenticationMapper) { - this.authenticationMapper = authenticationMapper; - } - - @Bean - public RestTemplate restTemplate() { - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(gatewayEndpoint)); - restTemplate.getMessageConverters().add(authenticationMapper.mappingJackson2HttpMessageConverter()); - return restTemplate; - } - - @Bean("brokerRestTemplate") - public RestTemplate brokerRestTemplate() { - final RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(gatewayEndpoint)); - restTemplate.getInterceptors() - .add(new BasicAuthenticationInterceptor(brokerUsername, brokerPassword)); - return restTemplate; - } -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/config/JacksonConfig.java b/dbrepo-user-service/services/src/main/java/at/tuwien/config/JacksonConfig.java deleted file mode 100644 index c4944a4691..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/config/JacksonConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package at.tuwien.config; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.Date; -import java.util.TimeZone; - -@Slf4j -@Configuration -public class JacksonConfig { - - @Bean - public ObjectMapper objectMapper() throws JsonProcessingException { - final ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.registerModule(new Jdk8Module()); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - objectMapper.setTimeZone(TimeZone.getTimeZone("UTC")); - log.debug("current time is {}", objectMapper.writeValueAsString(new Date())); - return objectMapper; - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/config/OpenSearchConfig.java b/dbrepo-user-service/services/src/main/java/at/tuwien/config/OpenSearchConfig.java deleted file mode 100644 index 48f9f2eeda..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/config/OpenSearchConfig.java +++ /dev/null @@ -1,61 +0,0 @@ -package at.tuwien.config; - -import lombok.extern.log4j.Log4j2; -import org.apache.http.HttpHost; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.opensearch.client.RestClient; -import org.opensearch.client.RestClientBuilder; -import org.opensearch.client.RestHighLevelClient; -import org.opensearch.client.sniff.NodesSniffer; -import org.opensearch.client.sniff.OpenSearchNodesSniffer; -import org.opensearch.client.sniff.Sniffer; -import org.opensearch.data.client.orhlc.AbstractOpenSearchConfiguration; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.TimeUnit; - -@Log4j2 -@Configuration -public class OpenSearchConfig extends AbstractOpenSearchConfiguration { - - @Value("${spring.opensearch.host}") - private String openSearchHost; - - @Value("${spring.opensearch.port}") - private Integer openSearchPort; - - @Value("${spring.opensearch.protocol}") - private String openSearchProtocol; - - @Value("${spring.opensearch.username}") - private String openSearchUsername; - - @Value("${spring.opensearch.password}") - private String openSearchPassword; - - @Bean - @Override - public RestHighLevelClient opensearchClient() { - log.debug("open search endpoint: {}://{}:{}", openSearchProtocol, openSearchHost, openSearchPort); - final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); - credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(openSearchUsername, openSearchPassword)); - RestClientBuilder builder = RestClient.builder(new HttpHost(openSearchHost, openSearchPort, openSearchProtocol)) - .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)); - return new RestHighLevelClient(builder); - } - - @Bean - public Sniffer nodesSniffer() { - final NodesSniffer nodesSniffer = new OpenSearchNodesSniffer(opensearchClient().getLowLevelClient(), - TimeUnit.SECONDS.toMillis(5), OpenSearchNodesSniffer.Scheme.HTTP); - return Sniffer.builder(opensearchClient().getLowLevelClient()) - .setNodesSniffer(nodesSniffer) - .build(); - - } -} \ No newline at end of file diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java b/dbrepo-user-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java deleted file mode 100644 index 5df5406709..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/config/WebSecurityConfig.java +++ /dev/null @@ -1,96 +0,0 @@ -package at.tuwien.config; - -import at.tuwien.auth.AuthTokenFilter; -import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; -import io.swagger.v3.oas.annotations.security.SecurityScheme; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; -import org.springframework.security.web.util.matcher.OrRequestMatcher; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; -import org.springframework.web.filter.CorsFilter; - -import jakarta.servlet.http.HttpServletResponse; - -@Configuration -@EnableWebSecurity -@EnableGlobalMethodSecurity(prePostEnabled = true) -@SecurityScheme( - name = "bearerAuth", - type = SecuritySchemeType.HTTP, - bearerFormat = "JWT", - scheme = "bearer" -) -public class WebSecurityConfig { - - @Bean - public AuthTokenFilter authTokenFilter() { - return new AuthTokenFilter(); - } - - @Bean - public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - final OrRequestMatcher internalEndpoints = new OrRequestMatcher( - new AntPathRequestMatcher("/actuator/**", "GET"), - new AntPathRequestMatcher("/v3/api-docs.yaml"), - new AntPathRequestMatcher("/v3/api-docs/**"), - new AntPathRequestMatcher("/swagger-ui/**"), - new AntPathRequestMatcher("/swagger-ui.html") - ); - final OrRequestMatcher publicEndpoints = new OrRequestMatcher( - new AntPathRequestMatcher("/api/user/**", "GET"), - new AntPathRequestMatcher("/api/user/**", "POST"), - new AntPathRequestMatcher("/api/maintenance/**", "GET") - ); - /* enable CORS and disable CSRF */ - http = http.cors().and().csrf().disable(); - /* set session management to stateless */ - http = http - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and(); - /* set unauthorized requests exception handler */ - http = http - .exceptionHandling() - .authenticationEntryPoint( - (request, response, ex) -> { - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, - ex.getMessage() - ); - } - ).and(); - /* set permissions on endpoints */ - http.authorizeHttpRequests() - /* our internal endpoints */ - .requestMatchers(internalEndpoints).permitAll() - /* our public endpoints */ - .requestMatchers(publicEndpoints).permitAll() - /* our private endpoints */ - .anyRequest().authenticated(); - /* add JWT token filter */ - http.addFilterBefore(authTokenFilter(), - UsernamePasswordAuthenticationFilter.class - ); - return http.build(); - } - - @Bean - public CorsFilter corsFilter() { - final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - final CorsConfiguration config = new CorsConfiguration(); - config.setAllowCredentials(true); - config.addAllowedOriginPattern("*"); - config.addAllowedHeader("*"); - config.addAllowedMethod("*"); - source.registerCorsConfiguration("/**", config); - return new CorsFilter(source); - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/BannerMessageNotFoundException.java b/dbrepo-user-service/services/src/main/java/at/tuwien/exception/BannerMessageNotFoundException.java deleted file mode 100644 index e4587b1453..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/BannerMessageNotFoundException.java +++ /dev/null @@ -1,20 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class BannerMessageNotFoundException extends Exception { - - public BannerMessageNotFoundException(String msg) { - super(msg); - } - - public BannerMessageNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public BannerMessageNotFoundException(Throwable thr) { - super(thr); - } -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/ForeignUserException.java b/dbrepo-user-service/services/src/main/java/at/tuwien/exception/ForeignUserException.java deleted file mode 100644 index 921a99180d..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/ForeignUserException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.METHOD_NOT_ALLOWED) -public class ForeignUserException extends Exception { - - public ForeignUserException(String message) { - super(message); - } - - public ForeignUserException(String message, Throwable thr) { - super(message, thr); - } - - public ForeignUserException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/NotAllowedException.java b/dbrepo-user-service/services/src/main/java/at/tuwien/exception/NotAllowedException.java deleted file mode 100644 index 44c3d430f9..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/NotAllowedException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.METHOD_NOT_ALLOWED) -public class NotAllowedException extends Exception { - - public NotAllowedException(String msg) { - super(msg); - } - - public NotAllowedException(String msg, Throwable thr) { - super(msg, thr); - } - - public NotAllowedException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/RealmNotFoundException.java b/dbrepo-user-service/services/src/main/java/at/tuwien/exception/RealmNotFoundException.java deleted file mode 100644 index 1750cfb525..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/RealmNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class RealmNotFoundException extends Exception { - - public RealmNotFoundException(String msg) { - super(msg); - } - - public RealmNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public RealmNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/RemoteUnavailableException.java b/dbrepo-user-service/services/src/main/java/at/tuwien/exception/RemoteUnavailableException.java deleted file mode 100644 index 3f6700d06b..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/RemoteUnavailableException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NO_CONTENT) -public class RemoteUnavailableException extends Exception { - - public RemoteUnavailableException(String msg) { - super(msg); - } - - public RemoteUnavailableException(String msg, Throwable thr) { - super(msg, thr); - } - - public RemoteUnavailableException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/RoleNotFoundException.java b/dbrepo-user-service/services/src/main/java/at/tuwien/exception/RoleNotFoundException.java deleted file mode 100644 index 8430d64d76..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/RoleNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class RoleNotFoundException extends Exception { - - public RoleNotFoundException(String msg) { - super(msg); - } - - public RoleNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public RoleNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserAlreadyExistsException.java b/dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserAlreadyExistsException.java deleted file mode 100644 index bca8199ae0..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserAlreadyExistsException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.CONFLICT) -public class UserAlreadyExistsException extends Exception { - - public UserAlreadyExistsException(String message) { - super(message); - } - - public UserAlreadyExistsException(String message, Throwable thr) { - super(message, thr); - } - - public UserAlreadyExistsException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserAttributeNotFoundException.java b/dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserAttributeNotFoundException.java deleted file mode 100644 index f0d3249868..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserAttributeNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND) -public class UserAttributeNotFoundException extends Exception { - - public UserAttributeNotFoundException(String msg) { - super(msg); - } - - public UserAttributeNotFoundException(String msg, Throwable thr) { - super(msg, thr); - } - - public UserAttributeNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserEmailAlreadyExistsException.java b/dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserEmailAlreadyExistsException.java deleted file mode 100644 index 803e94aa0a..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserEmailAlreadyExistsException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.EXPECTATION_FAILED) -public class UserEmailAlreadyExistsException extends Exception { - - public UserEmailAlreadyExistsException(String message) { - super(message); - } - - public UserEmailAlreadyExistsException(String message, Throwable thr) { - super(message, thr); - } - - public UserEmailAlreadyExistsException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserNotFoundException.java b/dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserNotFoundException.java deleted file mode 100644 index 0abb87f609..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/exception/UserNotFoundException.java +++ /dev/null @@ -1,21 +0,0 @@ -package at.tuwien.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "User not found") -public class UserNotFoundException extends Exception { - - public UserNotFoundException(String message) { - super(message); - } - - public UserNotFoundException(String message, Throwable thr) { - super(message, thr); - } - - public UserNotFoundException(Throwable thr) { - super(thr); - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/AuthenticationMapper.java b/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/AuthenticationMapper.java deleted file mode 100644 index 9d00f7e159..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/AuthenticationMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package at.tuwien.mapper; - -import org.mapstruct.Mapper; -import org.springframework.http.MediaType; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; - -import java.util.Collections; - -@Mapper(componentModel = "spring", uses = {UserMapper.class}) -public interface AuthenticationMapper { - - org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AuthenticationMapper.class); - - default MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { - final MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); - mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_FORM_URLENCODED)); - return mappingJackson2HttpMessageConverter; - } -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/BannerMessageMapper.java b/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/BannerMessageMapper.java deleted file mode 100644 index 8fd2b7dc51..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/BannerMessageMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package at.tuwien.mapper; - -import at.tuwien.api.maintenance.BannerMessageBriefDto; -import at.tuwien.api.maintenance.BannerMessageCreateDto; -import at.tuwien.api.maintenance.BannerMessageDto; -import at.tuwien.api.maintenance.BannerMessageTypeDto; -import at.tuwien.entities.maintenance.BannerMessage; -import at.tuwien.entities.maintenance.BannerMessageType; -import org.mapstruct.Mapper; - -@Mapper(componentModel = "spring") -public interface BannerMessageMapper { - - org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(BannerMessageMapper.class); - - BannerMessageDto bannerMessageToBannerMessageDto(BannerMessage data); - - BannerMessageBriefDto bannerMessageToBannerMessageBriefDto(BannerMessage data); - - BannerMessage bannerMessageCreateDtoToBannerMessage(BannerMessageCreateDto data); - - BannerMessageType bannerMessageTypeDtoToBannerMessageType(BannerMessageTypeDto data); - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/UserMapper.java b/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/UserMapper.java deleted file mode 100644 index d6dd1414cf..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/mapper/UserMapper.java +++ /dev/null @@ -1,58 +0,0 @@ -package at.tuwien.mapper; - -import at.tuwien.api.auth.SignupRequestDto; -import at.tuwien.api.user.GrantedAuthorityDto; -import at.tuwien.api.user.UserBriefDto; -import at.tuwien.api.user.UserDetailsDto; -import at.tuwien.api.user.UserDto; -import at.tuwien.entities.user.Group; -import at.tuwien.entities.user.GroupMembership; -import at.tuwien.entities.user.User; -import at.tuwien.entities.user.UserAttribute; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; - -import java.util.UUID; - -@Mapper(componentModel = "spring") -public interface UserMapper { - - org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserMapper.class); - - /* keep */ - @Mappings({ - @Mapping(target = "id", expression = "java(data.getId().toString())") - }) - UserDetailsDto userBriefDtoToUserDetailsDto(UserBriefDto data); - - UserDto userToUserDto(User data); - - UserBriefDto userToUserBriefDto(User data); - - User signupRequestDtoToUser(SignupRequestDto data); - - default GroupMembership userGroupToGroupMembership(User user, Group group) { - return GroupMembership.builder() - .userId(user.getId()) - .groupId(group.getId()) - .build(); - } - - default GrantedAuthority grantedAuthorityDtoToGrantedAuthority(GrantedAuthorityDto data) { - final GrantedAuthority authority = new SimpleGrantedAuthority(data.getAuthority()); - log.trace("mapped granted authority {} to granted authority {}", data, authority); - return authority; - } - - default UserAttribute tripleToUserAttribute(UUID userId, String name, String value) { - return UserAttribute.builder() - .id(UUID.randomUUID()) - .userId(userId) - .name(name) - .value(value) - .build(); - } -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/BannerMessageRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/BannerMessageRepository.java deleted file mode 100644 index ee4048ede1..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/BannerMessageRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.maintenance.BannerMessage; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface BannerMessageRepository extends JpaRepository<BannerMessage, Long> { - - List<BannerMessage> findByActive(); - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/CredentialRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/CredentialRepository.java deleted file mode 100644 index e9e9fdb8db..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/CredentialRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.user.Credential; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.UUID; - -@Repository -public interface CredentialRepository extends JpaRepository<Credential, UUID> { - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/GroupMembershipRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/GroupMembershipRepository.java deleted file mode 100644 index 2c6accb949..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/GroupMembershipRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.user.GroupMembership; -import at.tuwien.entities.user.GroupMembershipKey; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface GroupMembershipRepository extends JpaRepository<GroupMembership, GroupMembershipKey> { -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/GroupRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/GroupRepository.java deleted file mode 100644 index 5a56e16f92..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/GroupRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.user.Group; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.UUID; - -@Repository -public interface GroupRepository extends JpaRepository<Group, UUID> { - - List<Group> findDefault(); -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/RealmRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/RealmRepository.java deleted file mode 100644 index 56d2152fa0..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/RealmRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.user.Realm; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; -import java.util.UUID; - -@Repository -public interface RealmRepository extends JpaRepository<Realm, UUID> { - - Optional<Realm> findByName(String name); - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/RoleMappingRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/RoleMappingRepository.java deleted file mode 100644 index 345f96ff8a..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/RoleMappingRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.user.RoleMapping; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.UUID; - -@Repository -public interface RoleMappingRepository extends JpaRepository<RoleMapping, UUID> { -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/RoleRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/RoleRepository.java deleted file mode 100644 index f712472f77..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/RoleRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.user.Role; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; -import java.util.UUID; - -@Repository -public interface RoleRepository extends JpaRepository<Role, UUID> { - - Optional<Role> findByName(String name); - - Optional<Role> findDefault(); -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/UserAttributeRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/UserAttributeRepository.java deleted file mode 100644 index 6d96fc3584..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/UserAttributeRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.user.UserAttribute; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; -import java.util.UUID; - -@Repository -public interface UserAttributeRepository extends JpaRepository<UserAttribute, UUID> { - - Optional<UserAttribute> findByUserIdAndName(UUID userId, String name); - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/UserRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/UserRepository.java deleted file mode 100644 index c4b162f681..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/mdb/UserRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package at.tuwien.repository.mdb; - -import at.tuwien.entities.user.User; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; -import java.util.UUID; - -@Repository -public interface UserRepository extends JpaRepository<User, UUID> { - - Optional<User> findByUsername(String username); - - Optional<User> findByEmail(String email); - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/sdb/UserIdxRepository.java b/dbrepo-user-service/services/src/main/java/at/tuwien/repository/sdb/UserIdxRepository.java deleted file mode 100644 index 8f22ea7fe5..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/repository/sdb/UserIdxRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package at.tuwien.repository.sdb; - -import at.tuwien.api.user.UserDto; -import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; -import org.springframework.stereotype.Repository; - -import java.util.UUID; - -@Repository -public interface UserIdxRepository extends ElasticsearchRepository<UserDto, UUID> { -} \ No newline at end of file diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/BannerMessageService.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/BannerMessageService.java deleted file mode 100644 index a674fbbbdd..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/BannerMessageService.java +++ /dev/null @@ -1,60 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.api.maintenance.BannerMessageCreateDto; -import at.tuwien.api.maintenance.BannerMessageUpdateDto; -import at.tuwien.entities.maintenance.BannerMessage; -import at.tuwien.exception.BannerMessageNotFoundException; - -import java.util.List; - -public interface BannerMessageService { - - /** - * Finds all messages in the metadata database. - * - * @return List of messages. - */ - List<BannerMessage> findAll(); - - /** - * Finds all messages that are valid at the current point in time. - * - * @return List of active messages. - */ - List<BannerMessage> getActive(); - - /** - * Finds a specific message by given id in the metadata database. - * - * @param id The message id. - * @return The message, if successful. - * @throws BannerMessageNotFoundException The message was not found in the metadata database. - */ - BannerMessage find(Long id) throws BannerMessageNotFoundException; - - /** - * Creates a new maintenance message in the metadata database. - * - * @param data The message data. - * @return The created message, if successful. - */ - BannerMessage create(BannerMessageCreateDto data); - - /** - * Updates a maintenance message by given id in the metadata database. - * - * @param id The message id. - * @param data The updated message data. - * @return The updated message, if successful. - * @throws BannerMessageNotFoundException The message was not found in the metadata database. - */ - BannerMessage update(Long id, BannerMessageUpdateDto data) throws BannerMessageNotFoundException; - - /** - * Deletes a maintenance message by given id in the metadata database. - * - * @param id The message id. - * @throws BannerMessageNotFoundException The message was not found in the metadata database. - */ - void delete(Long id) throws BannerMessageNotFoundException; -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/RealmService.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/RealmService.java deleted file mode 100644 index 6c93de6086..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/RealmService.java +++ /dev/null @@ -1,16 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.entities.user.Realm; -import at.tuwien.exception.RealmNotFoundException; - -public interface RealmService { - - /** - * Finds a realm by name. - * - * @param name The realm name. - * @return The realm, if successful. - * @throws RealmNotFoundException The realm could not be found. - */ - Realm find(String name) throws RealmNotFoundException; -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/RoleService.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/RoleService.java deleted file mode 100644 index 08c3a0cc3f..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/RoleService.java +++ /dev/null @@ -1,8 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.entities.user.Role; -import at.tuwien.exception.RoleNotFoundException; - -public interface RoleService { - Role find(String name) throws RoleNotFoundException; -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserAttributeService.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserAttributeService.java deleted file mode 100644 index d8af9940ad..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserAttributeService.java +++ /dev/null @@ -1,15 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.entities.user.UserAttribute; -import at.tuwien.exception.UserAttributeNotFoundException; - -import java.util.UUID; - -public interface UserAttributeService { - - UserAttribute find(UUID userId, String name) throws UserAttributeNotFoundException; - - UserAttribute update(UUID userId, String name, String value) throws UserAttributeNotFoundException; - - UserAttribute create(UserAttribute userAttribute); -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserService.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserService.java deleted file mode 100644 index 9c0816ead6..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/UserService.java +++ /dev/null @@ -1,91 +0,0 @@ -package at.tuwien.service; - -import at.tuwien.api.auth.SignupRequestDto; -import at.tuwien.api.user.UserPasswordDto; -import at.tuwien.api.user.UserThemeSetDto; -import at.tuwien.api.user.UserUpdateDto; -import at.tuwien.entities.user.Realm; -import at.tuwien.entities.user.Role; -import at.tuwien.entities.user.User; -import at.tuwien.exception.*; - -import java.security.Principal; -import java.util.List; -import java.util.UUID; - -public interface UserService { - - /** - * Finds all users in the metadata database - * - * @return The list of users. - */ - List<User> findAll(); - - /** - * Creates a user in the metadata database managed by Keycloak in the given realm. - * - * @param data The user data. - * @param realm The realm this user should be created. - * @return The user, if successful. False otherwise. - * @throws UserAlreadyExistsException The user already exists in the metadata database. - */ - User create(SignupRequestDto data, Realm realm) throws UserAlreadyExistsException; - - /** - * Updates the user information for a user with given id in the metadata database. - * - * @param id The user id. - * @param data The user information. - * @return The user if successful. False otherwise. - * @throws UserNotFoundException The user was not found. - * @throws UserAttributeNotFoundException One or more user attributes for the user information were not found. - */ - User modify(UUID id, UserUpdateDto data) throws UserNotFoundException, UserAttributeNotFoundException; - - /** - * Updates the user password for a user with given id. - * - * @param id The user id. - * @param data The new password. - * @return The user if successful. False otherwise. - * @throws UserNotFoundException The user was not found. - */ - User updatePassword(UUID id, UserPasswordDto data) throws UserNotFoundException; - - /** - * Updates the user theme for a user with given id. - * - * @param id The user id. - * @param data The user theme. - * @return The user if successful. False otherwise. - * @throws UserNotFoundException The user was not found. - * @throws UserAttributeNotFoundException One or more user attributes for the user information were not found. - */ - User toggleTheme(UUID id, UserThemeSetDto data) throws UserNotFoundException, UserAttributeNotFoundException; - - /** - * Finds a specific user in the metadata database by given id. - * - * @param id The user id. - * @return The user if successful. False otherwise. - * @throws UserNotFoundException The user was not found. - */ - User find(UUID id) throws UserNotFoundException; - - /** - * Validates if a user with the given username already exists in the metadata database. - * - * @param username The username. - * @throws UserAlreadyExistsException The user with this username already exists. - */ - void validateUsernameNotExists(String username) throws UserAlreadyExistsException; - - /** - * Validates if a user with the given email already exists in the metadata database. - * - * @param email The email. - * @throws UserEmailAlreadyExistsException The user with this email already exists. - */ - void validateEmailNotExists(String email) throws UserEmailAlreadyExistsException; -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/BannerMessageServiceImpl.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/BannerMessageServiceImpl.java deleted file mode 100644 index 2e5bf09970..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/BannerMessageServiceImpl.java +++ /dev/null @@ -1,78 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.maintenance.BannerMessageCreateDto; -import at.tuwien.api.maintenance.BannerMessageUpdateDto; -import at.tuwien.entities.maintenance.BannerMessage; -import at.tuwien.exception.BannerMessageNotFoundException; -import at.tuwien.mapper.BannerMessageMapper; -import at.tuwien.repository.mdb.BannerMessageRepository; -import at.tuwien.service.BannerMessageService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Optional; - -@Log4j2 -@Service -public class BannerMessageServiceImpl implements BannerMessageService { - - private final BannerMessageMapper bannerMessageMapper; - private final BannerMessageRepository bannerMessageRepository; - - @Autowired - public BannerMessageServiceImpl(BannerMessageMapper bannerMessageMapper, - BannerMessageRepository bannerMessageRepository) { - this.bannerMessageMapper = bannerMessageMapper; - this.bannerMessageRepository = bannerMessageRepository; - } - - @Override - public List<BannerMessage> findAll() { - return bannerMessageRepository.findAll(); - } - - @Override - public List<BannerMessage> getActive() { - return bannerMessageRepository.findByActive(); - } - - @Override - public BannerMessage find(Long id) throws BannerMessageNotFoundException { - final Optional<BannerMessage> optional = bannerMessageRepository.findById(id); - if (optional.isEmpty()) { - log.error("Failed to find banner message with id {}", id); - throw new BannerMessageNotFoundException("Failed to find banner message with id " + id); - } - return optional.get(); - } - - @Override - public BannerMessage create(BannerMessageCreateDto data) { - final BannerMessage entity = bannerMessageMapper.bannerMessageCreateDtoToBannerMessage(data); - final BannerMessage message = bannerMessageRepository.save(entity); - log.info("Created banner message with id {}", message.getId()); - return message; - } - - @Override - public BannerMessage update(Long id, BannerMessageUpdateDto data) throws BannerMessageNotFoundException { - final BannerMessage entity = find(id); - entity.setMessage(data.getMessage()); - entity.setDisplayEnd(data.getDisplayEnd()); - entity.setDisplayStart(data.getDisplayStart()); - entity.setType(bannerMessageMapper.bannerMessageTypeDtoToBannerMessageType(data.getType())); - final BannerMessage message = bannerMessageRepository.save(entity); - log.info("Updated banner message with id {}", message.getId()); - return message; - } - - @Override - public void delete(Long id) throws BannerMessageNotFoundException { - find(id); - bannerMessageRepository.deleteById(id); - log.info("Deleted banner message with id {}", id); - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/RealmServiceImpl.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/RealmServiceImpl.java deleted file mode 100644 index 4ff1da34d8..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/RealmServiceImpl.java +++ /dev/null @@ -1,35 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.entities.user.Realm; -import at.tuwien.exception.RealmNotFoundException; -import at.tuwien.repository.mdb.RealmRepository; -import at.tuwien.service.RealmService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -@Log4j2 -@Service -public class RealmServiceImpl implements RealmService { - - private final RealmRepository realmRepository; - - @Autowired - public RealmServiceImpl(RealmRepository realmRepository) { - this.realmRepository = realmRepository; - } - - @Override - public Realm find(String name) throws RealmNotFoundException { - final Optional<Realm> optional = realmRepository.findByName(name); - if (optional.isEmpty()) { - log.error("Failed to find realm with name '{}'", name); - throw new RealmNotFoundException("Failed to find realm"); - } - final Realm realm = optional.get(); - log.trace("found realm {}", realm); - return realm; - } -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/RoleServiceImpl.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/RoleServiceImpl.java deleted file mode 100644 index 3f65f7d920..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/RoleServiceImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.entities.user.Role; -import at.tuwien.exception.RoleNotFoundException; -import at.tuwien.repository.mdb.RoleRepository; -import at.tuwien.service.RoleService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Optional; - -@Log4j2 -@Service -public class RoleServiceImpl implements RoleService { - - private final RoleRepository roleRepository; - - @Autowired - public RoleServiceImpl(RoleRepository roleRepository) { - this.roleRepository = roleRepository; - } - - @Override - public Role find(String name) throws RoleNotFoundException { - final Optional<Role> optional = roleRepository.findByName(name); - if (optional.isEmpty()) { - log.error("Failed to find role with name {}", name); - throw new RoleNotFoundException("Failed to find role with name " + name); - } - final Role role = optional.get(); - log.trace("found role {}", role); - return role; - } - -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserAttributeServiceImpl.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserAttributeServiceImpl.java deleted file mode 100644 index b8ef166f7e..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserAttributeServiceImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.entities.user.UserAttribute; -import at.tuwien.exception.UserAttributeNotFoundException; -import at.tuwien.repository.mdb.UserAttributeRepository; -import at.tuwien.service.UserAttributeService; -import lombok.extern.log4j.Log4j2; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Optional; -import java.util.UUID; - -@Log4j2 -@Service -public class UserAttributeServiceImpl implements UserAttributeService { - - private final UserAttributeRepository userAttributeRepository; - - @Autowired - public UserAttributeServiceImpl(UserAttributeRepository userAttributeRepository) { - this.userAttributeRepository = userAttributeRepository; - } - - @Override - public UserAttribute find(UUID userId, String name) throws UserAttributeNotFoundException { - final Optional<UserAttribute> optional = userAttributeRepository.findByUserIdAndName(userId, name); - if (optional.isEmpty()) { - log.error("Failed to find user attribute with name {}", name); - throw new UserAttributeNotFoundException("Failed to find user attribute with name " + name); - } - return optional.get(); - } - - @Override - public UserAttribute update(UUID userId, String name, String value) throws UserAttributeNotFoundException { - final UserAttribute entity = find(userId, name); - entity.setValue(value); - return userAttributeRepository.save(entity); - } - - @Override - public UserAttribute create(UserAttribute userAttribute) { - return userAttributeRepository.save(userAttribute); - } -} diff --git a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java b/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java deleted file mode 100644 index a1f26d1e54..0000000000 --- a/dbrepo-user-service/services/src/main/java/at/tuwien/service/impl/UserServiceImpl.java +++ /dev/null @@ -1,239 +0,0 @@ -package at.tuwien.service.impl; - -import at.tuwien.api.auth.SignupRequestDto; -import at.tuwien.api.user.UserPasswordDto; -import at.tuwien.api.user.UserThemeSetDto; -import at.tuwien.api.user.UserUpdateDto; -import at.tuwien.entities.user.*; -import at.tuwien.exception.*; -import at.tuwien.mapper.UserMapper; -import at.tuwien.repository.mdb.*; -import at.tuwien.repository.sdb.UserIdxRepository; -import at.tuwien.service.UserAttributeService; -import at.tuwien.service.UserService; -import lombok.extern.log4j.Log4j2; -import org.keycloak.common.util.Base64; -import org.keycloak.common.util.PaddingUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.PBEKeySpec; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.KeySpec; -import java.time.Instant; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -@Log4j2 -@Service -public class UserServiceImpl implements UserService { - - - private static final String ID = "pbkdf2-sha256"; - private static final String PBKDF2_ALGORITHM = "PBKDF2WithHmacSHA256"; - private static final int DEFAULT_ITERATIONS = 27500; - private static final Integer DERIVED_KEY_SIZE = 256; - private static final Integer MAX_PADDING_LENGTH = 14; - - private final UserMapper userMapper; - private final RoleRepository roleRepository; - private final UserRepository userRepository; - private final GroupRepository groupRepository; - private final UserIdxRepository userIdxRepository; - private final UserAttributeService userAttributeService; - private final CredentialRepository credentialRepository; - - @Autowired - public UserServiceImpl(UserMapper userMapper, RoleRepository roleRepository, UserRepository userRepository, - GroupRepository groupRepository, UserIdxRepository userIdxRepository, - UserAttributeService userAttributeService, CredentialRepository credentialRepository) { - this.userMapper = userMapper; - this.roleRepository = roleRepository; - this.userRepository = userRepository; - this.groupRepository = groupRepository; - this.userIdxRepository = userIdxRepository; - this.userAttributeService = userAttributeService; - this.credentialRepository = credentialRepository; - } - - @Override - @Transactional(readOnly = true) - public List<User> findAll() { - return userRepository.findAll(); - } - - @Override - @Transactional(rollbackFor = RuntimeException.class) - public User create(SignupRequestDto data, Realm realm) throws UserAlreadyExistsException { - /* create secret */ - final byte[] salt = getSalt(); - final StringBuilder secretData = new StringBuilder("{\"value\":\"") - .append(encodedCredential(data.getPassword(), DEFAULT_ITERATIONS, salt, DERIVED_KEY_SIZE)) - .append("\",\"salt\":\"") - .append(Base64.encodeBytes(salt)) - .append("\",\"additionalParameters\":{}}"); - Credential credential = Credential.builder() - .id(UUID.randomUUID()) - .createdDate(Instant.now().toEpochMilli()) - .secretData(secretData.toString()) - .type("password") - .priority(10) - .credentialData("{\"hashIterations\":" + DEFAULT_ITERATIONS + ",\"algorithm\":\"" + ID + "\",\"additionalParameters\":{}}") - .build(); - /* save user attributes */ - User user = userMapper.signupRequestDtoToUser(data); - user.setId(UUID.randomUUID()); - user.setEmailVerified(false); - user.setEnabled(true); - user.setRealmId(realm.getId()); - user.setCreatedTimestamp(Instant.now().toEpochMilli()); - user = userRepository.save(user); - final UserAttribute userAttribute1 = userAttributeService.create(userMapper.tripleToUserAttribute(user.getId(), - "theme_dark", "false")); - final UserAttribute userAttribute2 = userAttributeService.create(userMapper.tripleToUserAttribute(user.getId(), - "orcid", "")); - final UserAttribute userAttribute3 = userAttributeService.create(userMapper.tripleToUserAttribute(user.getId(), - "affiliation", "")); - credential.setUserId(user.getId()); - /* find default roles and groups */ - final List<Group> groups = groupRepository.findDefault(); - final Optional<Role> optionalRole = roleRepository.findDefault(); - if (optionalRole.isPresent()) { - final Role defaultRole = optionalRole.get(); - log.debug("set default role: {}", defaultRole.getName()); - user.setRoles(List.of(defaultRole)); - } else { - user.setRoles(List.of()); - } - /* save in metadata database */ - credential = credentialRepository.save(credential); - user.setCredentials(List.of(credential)); - user.setAttributes(List.of(userAttribute1, userAttribute2, userAttribute3)); - user.setGroups(groups); - log.info("Created user with id {} in metadata database", user.getId()); - /* save in open search database */ - userIdxRepository.save(userMapper.userToUserDto(user)); - log.info("Created user with id {} in open search database", user.getId()); - return user; - } - - @Override - @Transactional - public User modify(UUID id, UserUpdateDto data) throws UserNotFoundException, UserAttributeNotFoundException { - /* check */ - final User entity = find(id); - entity.setFirstname(data.getFirstname()); - entity.setLastname(data.getLastname()); - /* save in metadata database */ - final User user = userRepository.save(entity); - log.info("Modified user with id {}", user.getId()); - /* modify attributes */ - userAttributeService.update(user.getId(), "orcid", data.getOrcid()); - userAttributeService.update(user.getId(), "affiliation", data.getAffiliation()); - /* save in open search database */ - userIdxRepository.save(userMapper.userToUserDto(user)); - return user; - } - - @Override - @Transactional(rollbackFor = RuntimeException.class) - public User updatePassword(UUID id, UserPasswordDto data) throws UserNotFoundException { - final User user = find(id); - /* create secret */ - final byte[] salt = getSalt(); - final StringBuilder secretData = new StringBuilder("{\"value\":\"") - .append(encodedCredential(data.getPassword(), DEFAULT_ITERATIONS, salt, DERIVED_KEY_SIZE)) - .append("\",\"salt\":\"") - .append(Base64.encodeBytes(salt)) - .append("\",\"additionalParameters\":{}}"); - final Credential entity = Credential.builder() - .id(UUID.randomUUID()) - .userId(user.getId()) - .createdDate(Instant.now().toEpochMilli()) - .secretData(secretData.toString()) - .type("password") - .priority(10) - .credentialData("{\"hashIterations\":" + DEFAULT_ITERATIONS + ",\"algorithm\":\"" + ID + "\",\"additionalParameters\":{}}") - .build(); - /* save */ - final Credential credential = credentialRepository.save(entity); - user.setCredentials(List.of(credential)); - log.info("Updated user password with id {}", user.getId()); - return user; - } - - @Override - @Transactional - public User toggleTheme(UUID id, UserThemeSetDto data) throws UserNotFoundException, - UserAttributeNotFoundException { - /* check */ - final User user = find(id); - final UserAttribute entity = userAttributeService.update(user.getId(), "theme_dark", data.getThemeDark().toString()); - log.info("Updated theme by updating attribute with id {}", entity.getId()); - return user; - } - - @Override - @Transactional(readOnly = true) - public User find(UUID id) throws UserNotFoundException { - final Optional<User> optional = userRepository.findById(id); - if (optional.isEmpty()) { - log.error("Failed to retrieve user with id {}", id); - throw new UserNotFoundException("Failed to retrieve user"); - } - return optional.get(); - } - - @Override - @Transactional(readOnly = true) - public void validateUsernameNotExists(String username) throws UserAlreadyExistsException { - final Optional<User> optional = userRepository.findByUsername(username); - if (optional.isPresent()) { - log.error("User with username {} already exists", username); - throw new UserAlreadyExistsException("User with username " + username + " already exists"); - } - } - - @Override - @Transactional(readOnly = true) - public void validateEmailNotExists(String email) throws UserEmailAlreadyExistsException { - final Optional<User> optional = userRepository.findByEmail(email); - if (optional.isPresent()) { - log.error("User with email {} already exists", email); - throw new UserEmailAlreadyExistsException("User with email already exists"); - } - } - - private String encodedCredential(String rawPassword, int iterations, byte[] salt, int derivedKeySize) { - final String rawPasswordWithPadding = PaddingUtils.padding(rawPassword, MAX_PADDING_LENGTH); - final KeySpec spec = new PBEKeySpec(rawPasswordWithPadding.toCharArray(), salt, iterations, derivedKeySize); - try { - byte[] key = getSecretKeyFactory().generateSecret(spec).getEncoded(); - return Base64.encodeBytes(key); - } catch (InvalidKeySpecException e) { - throw new RuntimeException("Credential could not be encoded", e); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private byte[] getSalt() { - byte[] buffer = new byte[16]; - final SecureRandom secureRandom = new SecureRandom(); - secureRandom.nextBytes(buffer); - return buffer; - } - - private SecretKeyFactory getSecretKeyFactory() { - try { - return SecretKeyFactory.getInstance(PBKDF2_ALGORITHM); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(PBKDF2_ALGORITHM + " algorithm not found", e); - } - } -} diff --git a/dbrepo-user-service/services/src/test/resources/application.properties b/dbrepo-user-service/services/src/test/resources/application.properties deleted file mode 100644 index 69df4a3123..0000000000 --- a/dbrepo-user-service/services/src/test/resources/application.properties +++ /dev/null @@ -1,14 +0,0 @@ -# disable discovery -spring.cloud.discovery.enabled = false - -# disable cloud config and config discovery -spring.cloud.config.discovery.enabled = false -spring.cloud.config.enabled = false - -# disable datasource -spring.datasource.url=jdbc:h2:mem:testdb -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password=password -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect -spring.jpa.hibernate.ddl-auto=update \ No newline at end of file -- GitLab