diff --git a/dbrepo-identifier-service/.dockerignore b/dbrepo-identifier-service/.dockerignore deleted file mode 100644 index 36998121983d45bf75bdcdeded0116019f0b6f82..0000000000000000000000000000000000000000 --- 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 648659eaf4f4567251f8be20833a11e6f43e8c31..0000000000000000000000000000000000000000 --- 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 a45eb6ba269cd38f8965cef786729790945d9537..0000000000000000000000000000000000000000 --- 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 Binary files a/dbrepo-identifier-service/.mvn/wrapper/maven-wrapper.jar and /dev/null differ 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 642d572ce90e5085986bdd9c9204b9404f028084..0000000000000000000000000000000000000000 --- 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 bc20b4874a48216cea33c2394079d51fd8305466..0000000000000000000000000000000000000000 --- 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 9f9b6fcdd3c07732e54c9a0bf7c33746adaf9fde..0000000000000000000000000000000000000000 --- 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 01a432603d1497cb95ad8983bce9d8fc74bf6a0a..0000000000000000000000000000000000000000 --- 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 f037fcf89a806187b7cd4392b8f1369a1bc39db2..0000000000000000000000000000000000000000 --- 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 a16b5431b4c3cab50323a3f558003fd0abd87dad..0000000000000000000000000000000000000000 --- 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 c8d43372c986d97911cdc21bd87e0cbe3d83bdda..0000000000000000000000000000000000000000 --- 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 e03d06db1b8ab125b4b13f36b42f0d30e1797b50..0000000000000000000000000000000000000000 --- 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 3fafe6f6041986c3070809c66c3d80db51576a0d..0000000000000000000000000000000000000000 --- 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 89ed56a1ca9110f0a67e184aa756acb88391d438..0000000000000000000000000000000000000000 --- 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 6470353fa5b67ce52aa494b6558f1afb23921ff9..0000000000000000000000000000000000000000 --- 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 7c8ddcff285685220d7cb1fed793feea0f1a40ff..0000000000000000000000000000000000000000 --- 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 9b8509553e1a4048ea4de0d766ceea93e734a5db..0000000000000000000000000000000000000000 --- 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 96356874703a5a6c831caf4c6a892b40c6138fb5..0000000000000000000000000000000000000000 --- 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 a51a3c784ad9c0b997d9e1c19b673ea97665036b..0000000000000000000000000000000000000000 --- 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 7560da55d309f975df9c4efea470f0bd4dc05788..0000000000000000000000000000000000000000 --- 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 27a6c76130c2e77ee3dfe95b84a4e21e15b03646..0000000000000000000000000000000000000000 --- 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 4a6687e0e807f7fbb2243078053bc4641a900368..0000000000000000000000000000000000000000 --- 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 08f6f6a49694c73968337ea579b928adc5565e5a..0000000000000000000000000000000000000000 --- 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 9701f85dd63394bdb21d6a0b289ef0f43d967275..0000000000000000000000000000000000000000 --- 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 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 a0053062642c6c5327c990e579c30bc1db02a4c3..0000000000000000000000000000000000000000 --- 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 3165c7d39e7e84a8210520e30ff7f558e39e5866..0000000000000000000000000000000000000000 --- 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 d1da091e1e762482eb33249ad6f3060abc1c7cde..0000000000000000000000000000000000000000 --- 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 28d65ef38d53686adbfac50cae756943463da9e8..0000000000000000000000000000000000000000 --- 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 01f84e12b909533314c3cc741739e02801e78ee5..0000000000000000000000000000000000000000 --- 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 5626b5cda8a058cb0b10778a848b830d8bfb6520..0000000000000000000000000000000000000000 --- 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 c7d774799dc6c3fc09de344b2a833581f33c3b4e..0000000000000000000000000000000000000000 --- 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 0b5e179679530ab6fc3c35efea312fada717774b..0000000000000000000000000000000000000000 --- 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 e89cda19dc4dc5525974c37b45808fe44d33459f..0000000000000000000000000000000000000000 --- 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 3d4751850889ea8298579b38c38ab71b85b47a20..0000000000000000000000000000000000000000 --- 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 f8625b44ebab512d3a9b7a289bef6dd1f1204143..0000000000000000000000000000000000000000 --- 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 60251377f0716efe89f996768ad6bf5db3cd3f59..0000000000000000000000000000000000000000 --- 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 bb6762027aaead138ef8fbedd9620ad768a81d9d..0000000000000000000000000000000000000000 --- 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 3f9373e2723a6581795d475617f5e53807b93b36..0000000000000000000000000000000000000000 --- 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 5b40a26704b88f190a6bfed1d7deddb822d41e32..0000000000000000000000000000000000000000 --- 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 b5961bdc9736aaa3d288acd7277ee358f213c9d4..0000000000000000000000000000000000000000 --- 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 3dd124f81e8ce81a5f6dfe201d43f13596f6c008..0000000000000000000000000000000000000000 --- 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 d81b759744069c5831c661c888feba2c15b4128f..0000000000000000000000000000000000000000 --- 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 22397307c12cb16208fe5e15fcd1580fc3f81bd9..0000000000000000000000000000000000000000 --- 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 f43414ca5e18321a219d9611a5194bdfa7ef09ee..0000000000000000000000000000000000000000 --- 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 57d54a5ba60fab674d987f75ab555aecfaa6981e..0000000000000000000000000000000000000000 --- 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 69c497208297c73fa439369f3a75d758f89c3ec1..0000000000000000000000000000000000000000 --- 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 028a58d2d7a9534708dcbb3d1ab3a4032bc92ef8..0000000000000000000000000000000000000000 --- 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 ce6a65da6b9e838043cf89acd5febd86ae3b6d08..0000000000000000000000000000000000000000 --- 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 0f797e3861818f4a17cc6487e97f6ce08d2efa48..0000000000000000000000000000000000000000 --- 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 bab1cdadb13192dbf2c16f9dbfebb9fcc8385a36..0000000000000000000000000000000000000000 --- 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 9df96bed21348ede73192f16686e79aecc9c02dc..0000000000000000000000000000000000000000 --- 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 44190f2752de38baf1aa1856981729e433a1a4af..0000000000000000000000000000000000000000 --- 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 35a5374403f5de61697a0eaab9910352b4aed9a2..0000000000000000000000000000000000000000 --- 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 ac28d6fdeea46ae4c57e39c4dd6166b26e49703e..0000000000000000000000000000000000000000 --- 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 909031b2db36b3f9696af84ae423e33f1ffde199..0000000000000000000000000000000000000000 --- 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 286d4b8027ff9783728312bed95b6fcfebdacf21..0000000000000000000000000000000000000000 --- 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 21c3c1e0400af94bbd077d9a00dc300c0c6d3b1c..0000000000000000000000000000000000000000 --- 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 f747eb5bd6c8288173dba85b146d5883a7057b8b..0000000000000000000000000000000000000000 --- 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 442aae9772b28e793f4d2e8cda697f0428978923..0000000000000000000000000000000000000000 --- 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 f8482e47d5b0827e87537d940b54900a8f2d8f3b..0000000000000000000000000000000000000000 --- 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 d223099bf388927f1d61f68b507a1af728309222..0000000000000000000000000000000000000000 --- 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 b39d4b586071808e08eccb6149db1117e43b08c8..0000000000000000000000000000000000000000 --- 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 b32646c88937ce9a99d1416f7dab60b0a297887e..0000000000000000000000000000000000000000 --- 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 e14aa6610e04535fd56ca8c0617903a4075f9c1a..0000000000000000000000000000000000000000 --- 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 944d9dbae251edefadd917af4ed796c86490140c..0000000000000000000000000000000000000000 --- 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 1b4e85d36835aa94a927721aeb9aa9a97ab73416..0000000000000000000000000000000000000000 --- 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 cb6aaeede163f801df75feda9a105c9190c4ad9a..0000000000000000000000000000000000000000 --- 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/dbrepo-identifier-service/services/pom.xml b/dbrepo-identifier-service/services/pom.xml deleted file mode 100644 index d1eae1c8a06679bc1a45418de81a7c2344621a8e..0000000000000000000000000000000000000000 --- 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 92b60f4f8a5ed8a566e2504d71b63478b1593f68..0000000000000000000000000000000000000000 --- 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 ec84c3f4ff382ac41e0f7134217f527ebad87c81..0000000000000000000000000000000000000000 --- 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 88b1a613f81618ee1ae77c243a816135e4b1fb33..0000000000000000000000000000000000000000 --- 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 ca023e1ad0977cb3a3bf18753d5b8f90c1ffa042..0000000000000000000000000000000000000000 --- 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 a5c64eaa04daa81a13bbc0b0eac75cdaa70aaff9..0000000000000000000000000000000000000000 --- 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 48f9f2eedab0c47715f263b9d51cfa0b3ab43fb3..0000000000000000000000000000000000000000 --- 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 d38f17c6cb936e354b6b7362ccf8808476e24b47..0000000000000000000000000000000000000000 --- 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 4169e7977c4d9cb037a3721080b08efc00c060a4..0000000000000000000000000000000000000000 --- 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 84169f32e08a9580d23b3590bb7a5691dcfe3975..0000000000000000000000000000000000000000 --- 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 3c22d6ea357d69865bba2e827209426ec78a6d11..0000000000000000000000000000000000000000 --- 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 4530e1e9967f91f1d86ae4b3eff347ee0e28c224..0000000000000000000000000000000000000000 --- 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 e913485aad24e30b1fc67cf4d493b7233a02c33f..0000000000000000000000000000000000000000 --- 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 fefe477205e7fd431997e35b94d2ccba0e4bbd54..0000000000000000000000000000000000000000 --- 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 f0bb71f36492511efbe2c8c959dcdb97c679702f..0000000000000000000000000000000000000000 --- 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 b2748cb9a71fee96982605c4833c3edf11f8d012..0000000000000000000000000000000000000000 --- 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 ef20713d6f95170564908c42707cdea075cd3197..0000000000000000000000000000000000000000 --- 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 884a5d4bc5e0c3edf69eb98833405fd073f1582d..0000000000000000000000000000000000000000 --- 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 44c3d430f91d0ff44ce3fb4d1773b53231902d2b..0000000000000000000000000000000000000000 --- 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 0f87985305d93294f1dcbfc1648d3f13a74113de..0000000000000000000000000000000000000000 --- 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 a5e90754898f19f6cce8938d2385f3f9fecd43e4..0000000000000000000000000000000000000000 --- 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 3e18ea33b547e4a47ab03594479a1cfce8bb8653..0000000000000000000000000000000000000000 --- 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 e22cad5c36bc4d116c41cffb613a7b3419a9fb79..0000000000000000000000000000000000000000 --- 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 0abb87f609f0a6706c8e499eabc23e3d46d3304d..0000000000000000000000000000000000000000 --- 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 2f260975ff4746858184a4c8e5d4ee8268425625..0000000000000000000000000000000000000000 --- 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 2ffd0f6a0f776699f47afe852574d7a0c08ba34c..0000000000000000000000000000000000000000 --- 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 30bc0dc73dcc793621fc9be7a96a674a17be2a35..0000000000000000000000000000000000000000 --- 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 b949ddbaddb6bb6dfaba0b31f304a89266224cad..0000000000000000000000000000000000000000 --- 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 aef227e06f41f436c8e160efcc079a3736b149ce..0000000000000000000000000000000000000000 --- 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 29f226efe7ec5f3da50ba21ff47297b27dd49ae5..0000000000000000000000000000000000000000 --- 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 27517359c2a3c25e3ee057b1890b82ac805ad863..0000000000000000000000000000000000000000 --- 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 af3fe587327bc3b9e87114d99997b1acd275aea4..0000000000000000000000000000000000000000 --- 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 8e46c750662ef3c85814bf82e986187726444a8c..0000000000000000000000000000000000000000 --- 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 093ad37d18c43e1612e1c8b21a091bd8d64e06e5..0000000000000000000000000000000000000000 --- 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 a9c0970694d501000073cf097d2eee3a45268ec1..0000000000000000000000000000000000000000 --- 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 f47f17eae96fb5ab897d81507ff915077ef46ada..0000000000000000000000000000000000000000 --- 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 9a4fc4840def5978ecd19f6ac5e5aceae168a473..0000000000000000000000000000000000000000 --- 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 8ab57977706326894c8a152e8b690dd049729fc5..0000000000000000000000000000000000000000 --- 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 3972cc4c55ce86c27cf4b17f2bc18b350428badd..0000000000000000000000000000000000000000 --- 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 bac8f626c26760326cf2dfd17027b5d2e5d29cd1..0000000000000000000000000000000000000000 --- 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 643d28edf28aa429d6052477ff07eb5e0ea548a4..0000000000000000000000000000000000000000 --- 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 04a8da854e9fdcc99a059c3aa1d7728e21b8780b..0000000000000000000000000000000000000000 --- 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 916417563bae82eac6b43e2c070cc284e3a449cd..0000000000000000000000000000000000000000 --- 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 df6ec321689ad7fa1c05eb1430177aae79122133..0000000000000000000000000000000000000000 --- 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 7c93a9b27fb29edd1b67366b4d225b8e97fcd0ad..0000000000000000000000000000000000000000 --- 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 37ae148a864dd7fa52efbd21170b55df06973100..0000000000000000000000000000000000000000 --- 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 fbb52dc3564e42cf003c4afe9c36b4146b3e5fae..0000000000000000000000000000000000000000 --- 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 b1020fdcc532602d72cad5018b964edec4f25eea..0000000000000000000000000000000000000000 --- 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 da00aae798c0a66a096e6b85b1a8ed92362c7f73..0000000000000000000000000000000000000000 --- 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 67377273717420aee00239b28325d06e7d87f8ab..0000000000000000000000000000000000000000 --- 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 5cbbeb08bacd52ffc1b3fd021928dd06e7fbb16e..0000000000000000000000000000000000000000 --- 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 7244c3455c0a7d01a2649cec769d0c0dc09e3e6a..0000000000000000000000000000000000000000 --- 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 7c1fec39225336bb1ec6ffb15d70798d5f66f482..0000000000000000000000000000000000000000 --- 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 45e42d1515bbc6f94001363ce647a5d8472c9f6c..0000000000000000000000000000000000000000 --- 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 1cb63e6a239d4dd1a430bd36710559dc87694eed..0000000000000000000000000000000000000000 --- 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 1d081f4441ee1e3684c00a23815143c4986b93bf..0000000000000000000000000000000000000000 --- 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 6f01237644d735feee0995e85415c3b0f6da1448..0000000000000000000000000000000000000000 --- 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 0c34b4d3bfcd7677b194a4d137ca38da7c2fd9e3..0000000000000000000000000000000000000000 --- 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 b72b76179efe26d7cc5c51e647a930036214e9ff..0000000000000000000000000000000000000000 --- 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 9dc1637a549a11791493459024351742ab097e66..0000000000000000000000000000000000000000 --- 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 c086a2990c4f405ebc7d45a5cbbd47b8a3a4432b..0000000000000000000000000000000000000000 --- 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 ec3f7149657cdcbb3a23a92565945a8611f525d1..0000000000000000000000000000000000000000 --- 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 094995eb3e77ccaba894e22877d0118a5ff362f8..0000000000000000000000000000000000000000 --- 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 0a77b17ae17c5393132b505840048fe2df12db11..0000000000000000000000000000000000000000 --- 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 8c06fcfede41536dd2ec358bcf071a73f9848ac4..0000000000000000000000000000000000000000 --- 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 47f1ac286b3fa39407359baf5cdc58a4f8d700f5..0000000000000000000000000000000000000000 --- 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 298ea15687407b57d7d870e1574c4a1c742d375d..0000000000000000000000000000000000000000 --- 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 2e53ae6cdc17dcf9b915bc9aef3793701cba98e8..0000000000000000000000000000000000000000 --- 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/dbrepo-metadata-db/pom.xml b/dbrepo-metadata-db/pom.xml deleted file mode 100644 index 35b8b185da8a4c6895057a76eecde59f3d1b23db..0000000000000000000000000000000000000000 --- 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 7731f1adf24dc32351fdde402faa04b19e2f389f..0000000000000000000000000000000000000000 --- 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 a45eb6ba269cd38f8965cef786729790945d9537..0000000000000000000000000000000000000000 --- 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 Binary files a/dbrepo-semantics-service/.mvn/wrapper/maven-wrapper.jar and /dev/null differ 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 642d572ce90e5085986bdd9c9204b9404f028084..0000000000000000000000000000000000000000 --- 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 8a332ae36cf29a8f932f0cbb9313e91b69e1a86d..0000000000000000000000000000000000000000 --- 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 859ab6d6acf70e7fd13bdd9c10b666796de55538..0000000000000000000000000000000000000000 --- 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 a16b5431b4c3cab50323a3f558003fd0abd87dad..0000000000000000000000000000000000000000 --- 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 c8d43372c986d97911cdc21bd87e0cbe3d83bdda..0000000000000000000000000000000000000000 --- 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 f9ee92778cce7d67ab09b790a569e2ce6b539e88..0000000000000000000000000000000000000000 --- 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 d8ee5dded0ab744a1c12ea86d7e549cda654d89c..0000000000000000000000000000000000000000 --- 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 b2ca890c1faa5e04191bbeb49f9faf97feb973a3..0000000000000000000000000000000000000000 --- 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 bf0db3b8f8ebbd0331b9e5f542764dd2ae06a99f..0000000000000000000000000000000000000000 --- 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 ce076d891f4f563000502aeab5120732ed629a71..0000000000000000000000000000000000000000 --- 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 36d60d66b3073021c82f8bf66433db62325d7724..0000000000000000000000000000000000000000 --- 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 159f8c1eceaf230412dbacc1099f2c16675608b4..0000000000000000000000000000000000000000 --- 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 ce2f64c63807dfdcfdeab16a0f874f6514b8f158..0000000000000000000000000000000000000000 --- 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 3ce65ac4519e811467857b25c841a867dc38315c..0000000000000000000000000000000000000000 --- 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 92c33e77bcafb36492436bdad2482911b48598b8..0000000000000000000000000000000000000000 --- 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 e4b8076f7b1fecd15d98bfbbbe1b46e16087c114..0000000000000000000000000000000000000000 --- 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 0e7a2d5556d93d564a77a5c3768c80f002c6def7..0000000000000000000000000000000000000000 --- 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 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 5d1f8bd44e7e2f044e1effb24191f4262d83dd52..0000000000000000000000000000000000000000 --- 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 01f84e12b909533314c3cc741739e02801e78ee5..0000000000000000000000000000000000000000 --- 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 a1530c6279fe183093d014507e1d54ac2ea883ee..0000000000000000000000000000000000000000 --- 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 ba2485698e17258ae3ff6e0c3102397fd0e070ac..0000000000000000000000000000000000000000 --- 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 5d6523bd7db1b9861be4d24df872d8eb25f4ba83..0000000000000000000000000000000000000000 --- 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 d98245334f2e107d97303cb38a6098b1b1413cb7..0000000000000000000000000000000000000000 --- 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 e55d5ef87e69d86c17126c02974ec327f01e2ea6..0000000000000000000000000000000000000000 --- 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 50a6b5e63176d51b17e476156204d8529c63dcce..0000000000000000000000000000000000000000 --- 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 9ad5afda53575579a51cd64a198b7028625d6077..0000000000000000000000000000000000000000 --- 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 da1f1cc5a0b583f2377c5e2632256442d135d8ba..0000000000000000000000000000000000000000 --- 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 38bd58b1290fdf63217162106d32b35ed41ea1fb..0000000000000000000000000000000000000000 --- 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 29ef5b7c39c3c2025cdb9bf9978782b8e3022127..0000000000000000000000000000000000000000 --- 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 23602062cf3f44b49ddd8a4e97e22dfb6554405f..0000000000000000000000000000000000000000 --- 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 302797747d9c1a746cdc6a930fd21b847535210a..0000000000000000000000000000000000000000 --- 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 f8482e47d5b0827e87537d940b54900a8f2d8f3b..0000000000000000000000000000000000000000 --- 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 957368fcc773ecf22f419585b50206ad56359bc9..0000000000000000000000000000000000000000 --- 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/dbrepo-semantics-service/services/pom.xml b/dbrepo-semantics-service/services/pom.xml deleted file mode 100644 index b1ee2e0ce76f472221cf2c97e9fec25665d9768f..0000000000000000000000000000000000000000 --- 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 92b60f4f8a5ed8a566e2504d71b63478b1593f68..0000000000000000000000000000000000000000 --- 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 d89fef950ad78e4eb1a82fa2385b8f9d6a0cf2a8..0000000000000000000000000000000000000000 --- 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 c4944a469174ad1962d5c54cc483400dbee12f1d..0000000000000000000000000000000000000000 --- 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 48f9f2eedab0c47715f263b9d51cfa0b3ab43fb3..0000000000000000000000000000000000000000 --- 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 8b4729dcf0ff8a056f66a1881fff2e66813a2176..0000000000000000000000000000000000000000 --- 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 7364f797a3f48666b6836f7f2154fb48d32dad68..0000000000000000000000000000000000000000 --- 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 cb82fc0b9acc02f7e27faa3fa4f4efdeee8d6532..0000000000000000000000000000000000000000 --- 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 751bc2fb7ab5b6a8251b68e7e51808ae13d8d3c1..0000000000000000000000000000000000000000 --- 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 e83abd5eef61384fce6292ec2870b76ebcf70481..0000000000000000000000000000000000000000 --- 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 89fa3ed467e76998431c2b366bceb83804824f38..0000000000000000000000000000000000000000 --- 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 92f102fb569beec5c45eb6ed8a2043dabe702610..0000000000000000000000000000000000000000 --- 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 f758f7ddf3b3a9d28b2bfc7584a829e41d7c125f..0000000000000000000000000000000000000000 --- 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 4d36f77a6765c6142b6883974eebbc504da092fa..0000000000000000000000000000000000000000 --- 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 95c56e0a5c53be6d910b33a637de29ec43da5a32..0000000000000000000000000000000000000000 --- 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 de566881e569f57ef09b27d43ac7cf57cae5abd5..0000000000000000000000000000000000000000 --- 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 f41d2aa3fae70608ac913bde9ae299d57ce5b0a4..0000000000000000000000000000000000000000 --- 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 c11a773abc70ade28fdf7aa45845043fafcdd314..0000000000000000000000000000000000000000 --- 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 046fd51c3edd4a04becd27a2017cb38c88278ac7..0000000000000000000000000000000000000000 --- 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 fab911633e762bcca06113efbbed06e01f2e4e0f..0000000000000000000000000000000000000000 --- 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 7b53e7245983c7ca848da7c1175e0158e2f2a930..0000000000000000000000000000000000000000 --- 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 63fe90eea77e37867fe917dc896ee3b96498ae85..0000000000000000000000000000000000000000 --- 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 004f202d036ccec03c8ccaf10d206b70ed50922a..0000000000000000000000000000000000000000 --- 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 ef80b22e06e31c795a3d1d5cc37d2d719cb1db88..0000000000000000000000000000000000000000 --- 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 051a51f9439a2a6fb88047133b687b78885427f8..0000000000000000000000000000000000000000 --- 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 42d09c3e9eaecff5b277e10a724ebfb857a91c8b..0000000000000000000000000000000000000000 --- 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 a311002ac39720e119e81a050b0655cdb107aa36..0000000000000000000000000000000000000000 --- 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 5b7301819e945ea130bb868f90ef0fcb03474266..0000000000000000000000000000000000000000 --- 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 4a55f52491007c5ecae69bc6c59698541284a528..0000000000000000000000000000000000000000 --- 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 5ab8bda66dd267fdd6275ce3d4ef4026d11569ea..0000000000000000000000000000000000000000 --- 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 564b739af08341c7c1684e343ab36898bed354b7..0000000000000000000000000000000000000000 --- 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 e1294a942533feea38029ceefd0002995fa13d3b..0000000000000000000000000000000000000000 --- 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 6de26b3ffc045f5b7c4ac19223581e0f73a98b86..0000000000000000000000000000000000000000 --- 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 411ea767ecdfce7de3f8613ad690f618f96df431..0000000000000000000000000000000000000000 --- 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 802b0e7a07e0e8f8cd43176f4edb1214eb2ba31a..0000000000000000000000000000000000000000 --- 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 fd2365ac621fa275238c22d120cf312340739784..0000000000000000000000000000000000000000 --- 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 d4c2c6f267718d375cdff88173574b45aa0fd68d..0000000000000000000000000000000000000000 --- 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 43e1ae2d23b34719f8cf2e70cb9b6e6c46acec8e..0000000000000000000000000000000000000000 --- 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 d68acdb421ac6a167610221b2792e4dcafa4f935..0000000000000000000000000000000000000000 --- 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 67f852e33708a84af2ae63024cb1968932394998..0000000000000000000000000000000000000000 --- 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 ae61ee03af964f84a5e42666af5402e8ab930b8e..0000000000000000000000000000000000000000 --- 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 58c0085e5a10631b42b3258ad72aeceeea3244a1..0000000000000000000000000000000000000000 --- 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 2555a8836e2385b118e95ebf55545c25bdb4296b..0000000000000000000000000000000000000000 --- 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 866460b9a9a780799cea903104f4fefb9c9414c4..0000000000000000000000000000000000000000 --- 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 16286483e5305cf89e5ca53962bab42d0c18a730..0000000000000000000000000000000000000000 --- 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 353d949c4b4fb39c8b93bc22ef45fd325e53d0c2..0000000000000000000000000000000000000000 --- 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 49fdfc37f472476403edfd3f7555fa244fe69fe6..0000000000000000000000000000000000000000 --- 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 4f7ceb9ae7c5e6b9c09b87c14bbe8c34d602621b..0000000000000000000000000000000000000000 --- 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 78639cb60da78bc6b43743d957068c4d852d440b..0000000000000000000000000000000000000000 --- 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 d207f4e24d3ebff8f1a952ddc1e40df1a80b59f5..0000000000000000000000000000000000000000 --- 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 ce3b0aaa7debfef355ef4f57cea70c07da06bd29..0000000000000000000000000000000000000000 --- 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 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 01f90448caca030263dade2fe9e4d07c20b938f0..0000000000000000000000000000000000000000 --- 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 c5adb93d3dddc50757d88380ed50857a1e034610..0000000000000000000000000000000000000000 --- 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 41c39be818ad7656ceaac0afa6a24c7d97e63aca..0000000000000000000000000000000000000000 --- 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 2270b2e7aada6f3908b481ca674b25fb54a94bc6..0000000000000000000000000000000000000000 --- 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 4ced37e36342d85968a89064f82ec3d1b92dda1e..0000000000000000000000000000000000000000 --- 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 572ad17769a3987ae9159ce58c0eb6e2207b6d92..0000000000000000000000000000000000000000 --- 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 9cabbafa84ca63422d711e6cf65d8eae7a682388..0000000000000000000000000000000000000000 --- 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 132257159b1168cbbe96259b512b2e00c1da6569..0000000000000000000000000000000000000000 --- 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 f4a00ba858fa735f53e5bf58604048d83b105a68..0000000000000000000000000000000000000000 --- 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 1fb85f7b76063ad464017191318bb85043b87fc0..0000000000000000000000000000000000000000 --- 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 7ac8f6b527506484f8ead144bf3ea9fda55d4cc8..0000000000000000000000000000000000000000 --- 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 d3f4219416b303b5021bf8e92bafd3494e6f3a98..0000000000000000000000000000000000000000 --- 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 a4240a2231c63c27442188323fd41ac1f35075b2..0000000000000000000000000000000000000000 --- 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 f8482e47d5b0827e87537d940b54900a8f2d8f3b..0000000000000000000000000000000000000000 --- 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 606fcdf70802e7c696625274561730ff739349de..0000000000000000000000000000000000000000 --- 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 92b60f4f8a5ed8a566e2504d71b63478b1593f68..0000000000000000000000000000000000000000 --- 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 084171253fb67bc6bbd2ba70698360e0385c98d6..0000000000000000000000000000000000000000 --- 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 c4944a469174ad1962d5c54cc483400dbee12f1d..0000000000000000000000000000000000000000 --- 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 48f9f2eedab0c47715f263b9d51cfa0b3ab43fb3..0000000000000000000000000000000000000000 --- 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 5df540670976455fe25c8985718bd6a0e3a0d0d3..0000000000000000000000000000000000000000 --- 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 e4587b14539c329f409be25e5e67b2651771be88..0000000000000000000000000000000000000000 --- 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 921a99180d914e36f0898402720afbd493c6a6a6..0000000000000000000000000000000000000000 --- 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 44c3d430f91d0ff44ce3fb4d1773b53231902d2b..0000000000000000000000000000000000000000 --- 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 1750cfb525c2947f8f13837b5e89ed7ddc46f8fd..0000000000000000000000000000000000000000 --- 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 3f6700d06b277d59ccbf812136faec277261357d..0000000000000000000000000000000000000000 --- 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 8430d64d76c7a422a6e17752398c491cf6f78cd3..0000000000000000000000000000000000000000 --- 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 bca8199ae01a314e400ba065d367efe84dc6e972..0000000000000000000000000000000000000000 --- 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 f0d3249868a20ff1211226b4fefd2eade255f3db..0000000000000000000000000000000000000000 --- 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 803e94aa0a8c6ec2cf8f1d699d2fa490e76e0593..0000000000000000000000000000000000000000 --- 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 0abb87f609f0a6706c8e499eabc23e3d46d3304d..0000000000000000000000000000000000000000 --- 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 9d00f7e159748aa20dcb4cbf4df067c696f18b1a..0000000000000000000000000000000000000000 --- 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 8fd2b7dc51936768af6e2d9410887c15e6f19c1b..0000000000000000000000000000000000000000 --- 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 d6dd1414cfd26316d76920aaa1dfd67e160f12df..0000000000000000000000000000000000000000 --- 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 ee4048ede1b8dee2131c1522189407b83ebf17aa..0000000000000000000000000000000000000000 --- 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 e9e9fdb8db0d291d79e478ea6f0590ab21987b78..0000000000000000000000000000000000000000 --- 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 2c6accb9499246b52cbd6429b9eba67d26c13db8..0000000000000000000000000000000000000000 --- 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 5a56e16f92ec01f402e028b16038a813c56d489a..0000000000000000000000000000000000000000 --- 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 56d2152fa027b32d43ad2b966db167ba8ddae253..0000000000000000000000000000000000000000 --- 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 345f96ff8afbf673b1153bd46d1b7310817aa936..0000000000000000000000000000000000000000 --- 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 f712472f771f020b03d09bde4dba3a79fa457f78..0000000000000000000000000000000000000000 --- 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 6d96fc3584c79bfddae43faa467e0ab543e90780..0000000000000000000000000000000000000000 --- 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 c4b162f681d89b74ce1c1f70970999e140e089b4..0000000000000000000000000000000000000000 --- 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 8f22ea7fe5e692a94a09799d74ae144605cd7bf3..0000000000000000000000000000000000000000 --- 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 a674fbbbdd494f9999bf1bcdcc92ff68e892a465..0000000000000000000000000000000000000000 --- 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 6c93de60862f459c1ca80db0f7493babf36a8531..0000000000000000000000000000000000000000 --- 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 08c3a0cc3f693ce325eca257f4e972466f99bd6d..0000000000000000000000000000000000000000 --- 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 d8af9940ad232d4f7160362b0efa703146dffd0e..0000000000000000000000000000000000000000 --- 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 9c0816ead6f68b611f19193b336bc941c941b54d..0000000000000000000000000000000000000000 --- 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 2e5bf099706549fcc22a08ba6be54bf5e49e9692..0000000000000000000000000000000000000000 --- 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 4ff1da34d84784ad626d3be3926d21949f593d39..0000000000000000000000000000000000000000 --- 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 3f65f7d920344b79d199f67b21da26891b8f690d..0000000000000000000000000000000000000000 --- 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 b8ef166f7ed067021c9157b11baa0c5e7fa86d08..0000000000000000000000000000000000000000 --- 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 a1f26d1e540cc6e1720e12a72e4f41899357fea7..0000000000000000000000000000000000000000 --- 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 69df4a312304990e2f284318cd5428d960f14f0b..0000000000000000000000000000000000000000 --- 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