From da47f98ec5c7bcce896122ed4bfda8b14b9e37b1 Mon Sep 17 00:00:00 2001 From: Santeri Korri Date: Mon, 13 May 2024 19:14:42 +0300 Subject: [PATCH 1/5] OK-493 Tallennetaan jatkuvan sijoittelun data sijoittelun kantaan --- pom.xml | 24 + sijoittelu-service/README.md | 7 +- sijoittelu-service/pom.xml | 23 +- sijoittelu-service/postgresql/Dockerfile | 3 + .../configure-sijoittelu-database.sh | 23 + .../postgresql/docker-compose.yml | 10 + .../postgresql/docker/Dockerfile | 6 - .../postgresql/docker/configure-postgres.sh | 21 - .../docker/configure-sijoittelu-database.sh | 18 - .../postgresql/init_it_postgresql.sql | 4 - sijoittelu-service/postgresql/postgresql.conf | 614 ------------------ .../main/java/fi/vm/sade/sijoittelu/App.java | 3 +- .../JatkuvaSijoitteluDAO.java} | 7 +- .../seuranta => dao}/dto/SijoitteluDto.java | 2 +- .../dao/impl/JatkuvaSijoitteluDAOImpl.java | 113 ++++ .../impl/SijoitteluSeurantaResourceImpl.java | 143 ---- .../job/AjastettuSijoitteluJob.java | 6 +- .../SijoitteluAktivointiResource.java | 6 +- .../impl/JatkuvaSijoitteluRouteImpl.java | 8 +- .../route/impl/SijoitteluRouteConfig.java | 6 +- .../SijoitteluDatabaseConfiguration.java | 40 ++ .../SijoitteluServiceConfiguration.java | 21 +- ...ValintalaskentaDatabaseConfiguration.java} | 21 +- .../src/main/resources/application.yml | 3 - ...9000000__add_jatkuva_sijoittelu_schema.sql | 18 + .../java/fi/vm/sade/sijoittelu/DevApp.java | 7 +- .../sade/testing/AbstractIntegrationTest.java | 2 + .../testing/TestConfigurationWithMocks.java | 22 + .../java/fi/vm/sade/util/TempDockerDB.java | 12 +- .../src/test/resources/application.yml | 11 +- .../common.properties.template | 2 +- .../sijoittelu-service.properties.template | 5 + 32 files changed, 335 insertions(+), 876 deletions(-) create mode 100644 sijoittelu-service/postgresql/Dockerfile create mode 100755 sijoittelu-service/postgresql/configure-sijoittelu-database.sh create mode 100644 sijoittelu-service/postgresql/docker-compose.yml delete mode 100644 sijoittelu-service/postgresql/docker/Dockerfile delete mode 100644 sijoittelu-service/postgresql/docker/configure-postgres.sh delete mode 100755 sijoittelu-service/postgresql/docker/configure-sijoittelu-database.sh delete mode 100644 sijoittelu-service/postgresql/init_it_postgresql.sql delete mode 100644 sijoittelu-service/postgresql/postgresql.conf rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/{external/resource/seuranta/SijoitteluSeurantaResource.java => dao/JatkuvaSijoitteluDAO.java} (66%) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/{external/resource/seuranta => dao}/dto/SijoitteluDto.java (96%) create mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/impl/JatkuvaSijoitteluDAOImpl.java delete mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/external/resource/seuranta/impl/SijoitteluSeurantaResourceImpl.java create mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluDatabaseConfiguration.java rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/{DatabaseConfiguration.java => ValintalaskentaDatabaseConfiguration.java} (89%) create mode 100644 sijoittelu-service/src/main/resources/db/migration/V20240419000000__add_jatkuva_sijoittelu_schema.sql diff --git a/pom.xml b/pom.xml index 4cc716aff..b8890b704 100644 --- a/pom.xml +++ b/pom.xml @@ -88,6 +88,30 @@ + + fi.vm.sade.tarjonta + tarjonta-api + 2018-15-SNAPSHOT + compile + + + jsr311-api + javax.ws.rs + + + com.wordnik + * + + + * + org.springframework + + + org.apache.cxf + * + + + fi.vm.sade.java-utils opintopolku-cas-servlet-filter diff --git a/sijoittelu-service/README.md b/sijoittelu-service/README.md index a783ed0b6..44f1ff8c9 100644 --- a/sijoittelu-service/README.md +++ b/sijoittelu-service/README.md @@ -8,13 +8,8 @@ Joissakin tapauksissa on tarpeellista ajaa ympäristöä lokaalisti jonkin jaetu selvittämistä varten. Tämä onnistuu seuraavilla ohjeilla. 1. Kehitysympäristössä käytetään aina paikallista sijoittelutietokantaa (jotta skeemamuutoksia voi kehittää lokaalisti). -Luo PostgreSQL kontti seuraavilla komennoilla (tarvitsee tehdä vain kerran): +Kanta on konfiguroitu docker-composella, joten tämän pitää olla asennettu. - ``` shell - cd sijoittelu-service/postgresql/docker - docker build --tag sijoittelu-postgres . - docker create --name sijoittelu-postgres --env POSTGRES_PASSWORD=postgres -p 5433:5432 sijoittelu-postgres - ``` 2. Kopioi konfiguraatio-template lokaalia kehitystä varten ```'/src/test/resources/application-dev.properties.template'``` -> ```'/src/test/resources/application-dev.properties'```. Application-dev.properties on ignoroitu Gitissä etteivät salasanat valu repoon. Tähän tiedostoon täytyy täyttää tarvittavat testi-ympäristön diff --git a/sijoittelu-service/pom.xml b/sijoittelu-service/pom.xml index b56d25bfa..efd4a501a 100644 --- a/sijoittelu-service/pom.xml +++ b/sijoittelu-service/pom.xml @@ -42,6 +42,10 @@ org.springframework.boot spring-boot-starter-quartz + + org.springframework.boot + spring-boot-starter-jdbc + org.springdoc springdoc-openapi-ui @@ -185,26 +189,7 @@ fi.vm.sade.tarjonta tarjonta-api - 2018-15-SNAPSHOT compile - - - jsr311-api - javax.ws.rs - - - com.wordnik - * - - - * - org.springframework - - - org.apache.cxf - * - - diff --git a/sijoittelu-service/postgresql/Dockerfile b/sijoittelu-service/postgresql/Dockerfile new file mode 100644 index 000000000..6bb7100b0 --- /dev/null +++ b/sijoittelu-service/postgresql/Dockerfile @@ -0,0 +1,3 @@ +FROM postgres:15 + +COPY configure-sijoittelu-database.sh /docker-entrypoint-initdb.d/ \ No newline at end of file diff --git a/sijoittelu-service/postgresql/configure-sijoittelu-database.sh b/sijoittelu-service/postgresql/configure-sijoittelu-database.sh new file mode 100755 index 000000000..93c0799a9 --- /dev/null +++ b/sijoittelu-service/postgresql/configure-sijoittelu-database.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +set -euo pipefail + +DB_APP_VALINTAREKISTERI_DB=valintarekisteri +DB_APP_SIJOITTELU_DB=sijoittelu +DB_APP_USER=oph +DB_APP_PASSWORD=oph + +echo "Creating databases \"$DB_APP_VALINTAREKISTERI_DB\", \"$DB_APP_SIJOITTELU_DB\", creating role \"$DB_APP_USER\" with database owner privileges…" + +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-END +create role "${DB_APP_USER}" with password '${DB_APP_PASSWORD}' login; +create database "${DB_APP_VALINTAREKISTERI_DB}" encoding 'UTF-8' lc_collate 'C' lc_ctype 'C' TEMPLATE template0; +grant all privileges on database "${DB_APP_VALINTAREKISTERI_DB}" to "${DB_APP_USER}"; +create database "${DB_APP_SIJOITTELU_DB}" encoding 'UTF-8' lc_collate 'C' lc_ctype 'C' TEMPLATE template0; +grant all privileges on database "${DB_APP_SIJOITTELU_DB}" to "${DB_APP_USER}"; +END + +psql "${DB_APP_VALINTAREKISTERI_DB}" -c "ALTER SCHEMA \"public\" OWNER TO \"${DB_APP_USER}\"" \ + -c "GRANT ALL ON SCHEMA \"public\" TO \"${DB_APP_USER}\"" +psql "${DB_APP_SIJOITTELU_DB}" -c "ALTER SCHEMA \"public\" OWNER TO \"${DB_APP_USER}\"" \ + -c "GRANT ALL ON SCHEMA \"public\" TO \"${DB_APP_USER}\"" \ No newline at end of file diff --git a/sijoittelu-service/postgresql/docker-compose.yml b/sijoittelu-service/postgresql/docker-compose.yml new file mode 100644 index 000000000..ffb6e27d9 --- /dev/null +++ b/sijoittelu-service/postgresql/docker-compose.yml @@ -0,0 +1,10 @@ +version: '3.2' +services: + db: + container_name: "sijoittelu-postgres" + environment: + - POSTGRES_PASSWORD="postgres" + build: + context: "." + ports: + - "5433:5432" diff --git a/sijoittelu-service/postgresql/docker/Dockerfile b/sijoittelu-service/postgresql/docker/Dockerfile deleted file mode 100644 index 90503acc9..000000000 --- a/sijoittelu-service/postgresql/docker/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -# Based on - -FROM postgres:12.12 - -COPY ./configure-postgres.sh /docker-entrypoint-initdb.d/ -COPY configure-sijoittelu-database.sh /docker-entrypoint-initdb.d/ \ No newline at end of file diff --git a/sijoittelu-service/postgresql/docker/configure-postgres.sh b/sijoittelu-service/postgresql/docker/configure-postgres.sh deleted file mode 100644 index f6f3ba320..000000000 --- a/sijoittelu-service/postgresql/docker/configure-postgres.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -echo "Configuring PostgreSQL to log database modification statements…" - -cat <> /var/lib/postgresql/data/postgresql.conf -log_destination = 'stderr' -log_line_prefix = '%t %u ' -log_statement = 'mod' -log_timezone = 'Europe/Helsinki' -max_connections = 100 -shared_buffers = 128MB -datestyle = 'iso, mdy' -timezone = 'Europe/Helsinki' -lc_messages = 'en_US.UTF-8' -lc_monetary = 'en_US.UTF-8' -lc_numeric = 'en_US.UTF-8' -lc_time = 'en_US.UTF-8' -default_text_search_config = 'pg_catalog.english' -END diff --git a/sijoittelu-service/postgresql/docker/configure-sijoittelu-database.sh b/sijoittelu-service/postgresql/docker/configure-sijoittelu-database.sh deleted file mode 100755 index b5d65c8b2..000000000 --- a/sijoittelu-service/postgresql/docker/configure-sijoittelu-database.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -DB_APP_DB=sijoittelu -DB_APP_USER=oph -DB_APP_PASSWORD=oph - -echo "Creating database \"$DB_APP_DB\", creating role \"$DB_APP_USER\" with database owner privileges…" - -psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-END -create role "${DB_APP_USER}" with password '${DB_APP_PASSWORD}' login; -create database "${DB_APP_DB}" encoding 'UTF-8' lc_collate 'C' lc_ctype 'C' TEMPLATE template0; -grant all privileges on database "${DB_APP_DB}" to "${DB_APP_USER}"; -END - -psql "${DB_APP_DB}" -c "ALTER SCHEMA \"public\" OWNER TO \"${DB_APP_USER}\"" \ - -c "GRANT ALL ON SCHEMA \"public\" TO \"${DB_APP_USER}\"" \ No newline at end of file diff --git a/sijoittelu-service/postgresql/init_it_postgresql.sql b/sijoittelu-service/postgresql/init_it_postgresql.sql deleted file mode 100644 index 20d126584..000000000 --- a/sijoittelu-service/postgresql/init_it_postgresql.sql +++ /dev/null @@ -1,4 +0,0 @@ -CREATE ROLE oph; -ALTER ROLE oph WITH login; -ALTER SCHEMA public OWNER TO oph; -GRANT ALL ON SCHEMA public TO oph; diff --git a/sijoittelu-service/postgresql/postgresql.conf b/sijoittelu-service/postgresql/postgresql.conf deleted file mode 100644 index e32987221..000000000 --- a/sijoittelu-service/postgresql/postgresql.conf +++ /dev/null @@ -1,614 +0,0 @@ -# ----------------------------- -# PostgreSQL configuration file -# ----------------------------- -# -# This file consists of lines of the form: -# -# name = value -# -# (The "=" is optional.) Whitespace may be used. Comments are introduced with -# "#" anywhere on a line. The complete list of parameter names and allowed -# values can be found in the PostgreSQL documentation. -# -# The commented-out settings shown in this file represent the default values. -# Re-commenting a setting is NOT sufficient to revert it to the default value; -# you need to reload the server. -# -# This file is read on server startup and when the server receives a SIGHUP -# signal. If you edit the file on a running system, you have to SIGHUP the -# server for the changes to take effect, or use "pg_ctl reload". Some -# parameters, which are marked below, require a server shutdown and restart to -# take effect. -# -# Any parameter can also be given as a command-line option to the server, e.g., -# "postgres -c log_connections=on". Some parameters can be changed at run time -# with the "SET" SQL command. -# -# Memory units: kB = kilobytes Time units: ms = milliseconds -# MB = megabytes s = seconds -# GB = gigabytes min = minutes -# TB = terabytes h = hours -# d = days - - -#------------------------------------------------------------------------------ -# FILE LOCATIONS -#------------------------------------------------------------------------------ - -# The default values of these variables are driven from the -D command-line -# option or PGDATA environment variable, represented here as ConfigDir. - -#data_directory = 'ConfigDir' # use data in another directory -# (change requires restart) -#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file -# (change requires restart) -#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file -# (change requires restart) - -# If external_pid_file is not explicitly set, no extra PID file is written. -#external_pid_file = '' # write an extra PID file -# (change requires restart) - - -#------------------------------------------------------------------------------ -# CONNECTIONS AND AUTHENTICATION -#------------------------------------------------------------------------------ - -# - Connection Settings - - -#listen_addresses = 'localhost' # what IP address(es) to listen on; -# comma-separated list of addresses; -# defaults to 'localhost'; use '*' for all -# (change requires restart) -#port = 5432 # (change requires restart) -max_connections = 100 # (change requires restart) -# Note: Increasing max_connections costs ~400 bytes of shared memory per -# connection slot, plus lock space (see max_locks_per_transaction). -#superuser_reserved_connections = 3 # (change requires restart) -#unix_socket_directories = '/tmp' # comma-separated list of directories -# (change requires restart) -#unix_socket_group = '' # (change requires restart) -#unix_socket_permissions = 0777 # begin with 0 to use octal notation -# (change requires restart) -#bonjour = off # advertise server via Bonjour -# (change requires restart) -#bonjour_name = '' # defaults to the computer name -# (change requires restart) - -# - Security and Authentication - - -#authentication_timeout = 1min # 1s-600s -#ssl = off # (change requires restart) -#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers -# (change requires restart) -#ssl_prefer_server_ciphers = on # (change requires restart) -#ssl_ecdh_curve = 'prime256v1' # (change requires restart) -#ssl_renegotiation_limit = 512MB # amount of data between renegotiations -#ssl_cert_file = 'server.crt' # (change requires restart) -#ssl_key_file = 'server.key' # (change requires restart) -#ssl_ca_file = '' # (change requires restart) -#ssl_crl_file = '' # (change requires restart) -#password_encryption = on -#db_user_namespace = off - -# GSSAPI using Kerberos -#krb_server_keyfile = '' -#krb_caseins_users = off - -# - TCP Keepalives - -# see "man 7 tcp" for details - -#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; -# 0 selects the system default -#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; -# 0 selects the system default -#tcp_keepalives_count = 0 # TCP_KEEPCNT; -# 0 selects the system default - - -#------------------------------------------------------------------------------ -# RESOURCE USAGE (except WAL) -#------------------------------------------------------------------------------ - -# - Memory - - -shared_buffers = 128MB # min 128kB -# (change requires restart) -#huge_pages = try # on, off, or try -# (change requires restart) -#temp_buffers = 8MB # min 800kB -#max_prepared_transactions = 0 # zero disables the feature -# (change requires restart) -# Note: Increasing max_prepared_transactions costs ~600 bytes of shared memory -# per transaction slot, plus lock space (see max_locks_per_transaction). -# It is not advisable to set max_prepared_transactions nonzero unless you -# actively intend to use prepared transactions. -#work_mem = 4MB # min 64kB -#maintenance_work_mem = 64MB # min 1MB -#autovacuum_work_mem = -1 # min 1MB, or -1 to use maintenance_work_mem -#max_stack_depth = 2MB # min 100kB -#dynamic_shared_memory_type = posix # the default is the first option -# supported by the operating system: -# posix -# sysv -# windows -# mmap -# use none to disable dynamic shared memory - -# - Disk - - -#temp_file_limit = -1 # limits per-session temp file space -# in kB, or -1 for no limit - -# - Kernel Resource Usage - - -#max_files_per_process = 1000 # min 25 -# (change requires restart) -#shared_preload_libraries = '' # (change requires restart) - -# - Cost-Based Vacuum Delay - - -#vacuum_cost_delay = 0 # 0-100 milliseconds -#vacuum_cost_page_hit = 1 # 0-10000 credits -#vacuum_cost_page_miss = 10 # 0-10000 credits -#vacuum_cost_page_dirty = 20 # 0-10000 credits -#vacuum_cost_limit = 200 # 1-10000 credits - -# - Background Writer - - -#bgwriter_delay = 200ms # 10-10000ms between rounds -#bgwriter_lru_maxpages = 100 # 0-1000 max buffers written/round -#bgwriter_lru_multiplier = 2.0 # 0-10.0 multipler on buffers scanned/round - -# - Asynchronous Behavior - - -#effective_io_concurrency = 1 # 1-1000; 0 disables prefetching -#max_worker_processes = 8 - - -#------------------------------------------------------------------------------ -# WRITE AHEAD LOG -#------------------------------------------------------------------------------ - -# - Settings - - -#wal_level = minimal # minimal, archive, hot_standby, or logical -# (change requires restart) -#fsync = on # turns forced synchronization on or off -#synchronous_commit = on # synchronization level; -# off, local, remote_write, or on -#wal_sync_method = fsync # the default is the first option -# supported by the operating system: -# open_datasync -# fdatasync (default on Linux) -# fsync -# fsync_writethrough -# open_sync -#full_page_writes = on # recover from partial page writes -#wal_log_hints = off # also do full page writes of non-critical updates -# (change requires restart) -#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers -# (change requires restart) -#wal_writer_delay = 200ms # 1-10000 milliseconds - -#commit_delay = 0 # range 0-100000, in microseconds -#commit_siblings = 5 # range 1-1000 - -# - Checkpoints - - -#checkpoint_segments = 3 # in logfile segments, min 1, 16MB each -#checkpoint_timeout = 5min # range 30s-1h -#checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0 -#checkpoint_warning = 30s # 0 disables - -# - Archiving - - -#archive_mode = off # allows archiving to be done -# (change requires restart) -#archive_command = '' # command to use to archive a logfile segment -# placeholders: %p = path of file to archive -# %f = file name only -# e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f' -#archive_timeout = 0 # force a logfile segment switch after this -# number of seconds; 0 disables - - -#------------------------------------------------------------------------------ -# REPLICATION -#------------------------------------------------------------------------------ - -# - Sending Server(s) - - -# Set these on the master and on any standby that will send replication data. - -#max_wal_senders = 0 # max number of walsender processes -# (change requires restart) -#wal_keep_segments = 0 # in logfile segments, 16MB each; 0 disables -#wal_sender_timeout = 60s # in milliseconds; 0 disables - -#max_replication_slots = 0 # max number of replication slots -# (change requires restart) - -# - Master Server - - -# These settings are ignored on a standby server. - -#synchronous_standby_names = '' # standby servers that provide sync rep -# comma-separated list of application_name -# from standby(s); '*' = all -#vacuum_defer_cleanup_age = 0 # number of xacts by which cleanup is delayed - -# - Standby Servers - - -# These settings are ignored on a master server. - -#hot_standby = off # "on" allows queries during recovery -# (change requires restart) -#max_standby_archive_delay = 30s # max delay before canceling queries -# when reading WAL from archive; -# -1 allows indefinite delay -#max_standby_streaming_delay = 30s # max delay before canceling queries -# when reading streaming WAL; -# -1 allows indefinite delay -#wal_receiver_status_interval = 10s # send replies at least this often -# 0 disables -#hot_standby_feedback = off # send info from standby to prevent -# query conflicts -#wal_receiver_timeout = 60s # time that receiver waits for -# communication from master -# in milliseconds; 0 disables - - -#------------------------------------------------------------------------------ -# QUERY TUNING -#------------------------------------------------------------------------------ - -# - Planner Method Configuration - - -#enable_bitmapscan = on -#enable_hashagg = on -#enable_hashjoin = on -#enable_indexscan = on -#enable_indexonlyscan = on -#enable_material = on -#enable_mergejoin = on -#enable_nestloop = on -#enable_seqscan = on -#enable_sort = on -#enable_tidscan = on - -# - Planner Cost Constants - - -#seq_page_cost = 1.0 # measured on an arbitrary scale -#random_page_cost = 4.0 # same scale as above -#cpu_tuple_cost = 0.01 # same scale as above -#cpu_index_tuple_cost = 0.005 # same scale as above -#cpu_operator_cost = 0.0025 # same scale as above -#effective_cache_size = 4GB - -# - Genetic Query Optimizer - - -#geqo = on -#geqo_threshold = 12 -#geqo_effort = 5 # range 1-10 -#geqo_pool_size = 0 # selects default based on effort -#geqo_generations = 0 # selects default based on effort -#geqo_selection_bias = 2.0 # range 1.5-2.0 -#geqo_seed = 0.0 # range 0.0-1.0 - -# - Other Planner Options - - -#default_statistics_target = 100 # range 1-10000 -#constraint_exclusion = partition # on, off, or partition -#cursor_tuple_fraction = 0.1 # range 0.0-1.0 -#from_collapse_limit = 8 -#join_collapse_limit = 8 # 1 disables collapsing of explicit -# JOIN clauses - - -#------------------------------------------------------------------------------ -# ERROR REPORTING AND LOGGING -#------------------------------------------------------------------------------ - -# - Where to Log - - -#log_destination = 'stderr' # Valid values are combinations of -# stderr, csvlog, syslog, and eventlog, -# depending on platform. csvlog -# requires logging_collector to be on. - -# This is used when logging to stderr: -#logging_collector = off # Enable capturing of stderr and csvlog -# into log files. Required to be on for -# csvlogs. -# (change requires restart) - -# These are only used if logging_collector is on: -#log_directory = 'pg_log' # directory where log files are written, -# can be absolute or relative to PGDATA -#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern, -# can include strftime() escapes -#log_file_mode = 0600 # creation mode for log files, -# begin with 0 to use octal notation -#log_truncate_on_rotation = off # If on, an existing log file with the -# same name as the new log file will be -# truncated rather than appended to. -# But such truncation only occurs on -# time-driven rotation, not on restarts -# or size-driven rotation. Default is -# off, meaning append to existing files -# in all cases. -#log_rotation_age = 1d # Automatic rotation of logfiles will -# happen after that time. 0 disables. -#log_rotation_size = 10MB # Automatic rotation of logfiles will -# happen after that much log output. -# 0 disables. - -# These are relevant when logging to syslog: -#syslog_facility = 'LOCAL0' -#syslog_ident = 'postgres' - -# This is only relevant when logging to eventlog (win32): -#event_source = 'PostgreSQL' - -# - When to Log - - -#client_min_messages = notice # values in order of decreasing detail: -# debug5 -# debug4 -# debug3 -# debug2 -# debug1 -# log -# notice -# warning -# error - -#log_min_messages = warning # values in order of decreasing detail: -# debug5 -# debug4 -# debug3 -# debug2 -# debug1 -# info -# notice -# warning -# error -# log -# fatal -# panic - -#log_min_error_statement = error # values in order of decreasing detail: -# debug5 -# debug4 -# debug3 -# debug2 -# debug1 -# info -# notice -# warning -# error -# log -# fatal -# panic (effectively off) - -#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements -# and their durations, > 0 logs only -# statements running at least this number -# of milliseconds - - -# - What to Log - - -#debug_print_parse = off -#debug_print_rewritten = off -#debug_print_plan = off -#debug_pretty_print = on -#log_checkpoints = off -#log_connections = off -#log_disconnections = off -#log_duration = off -#log_error_verbosity = default # terse, default, or verbose messages -#log_hostname = off -#log_line_prefix = '' # special values: -# %a = application name -# %u = user name -# %d = database name -# %r = remote host and port -# %h = remote host -# %p = process ID -# %t = timestamp without milliseconds -# %m = timestamp with milliseconds -# %i = command tag -# %e = SQL state -# %c = session ID -# %l = session line number -# %s = session start timestamp -# %v = virtual transaction ID -# %x = transaction ID (0 if none) -# %q = stop here in non-session -# processes -# %% = '%' -# e.g. '<%u%%%d> ' -#log_lock_waits = off # log lock waits >= deadlock_timeout -#log_statement = 'none' # none, ddl, mod, all -#log_temp_files = -1 # log temporary files equal or larger -# than the specified size in kilobytes; -# -1 disables, 0 logs all temp files -log_timezone = 'Europe/Helsinki' - - -#------------------------------------------------------------------------------ -# RUNTIME STATISTICS -#------------------------------------------------------------------------------ - -# - Query/Index Statistics Collector - - -#track_activities = on -#track_counts = on -#track_io_timing = off -#track_functions = none # none, pl, all -#track_activity_query_size = 1024 # (change requires restart) -#update_process_title = on -#stats_temp_directory = 'pg_stat_tmp' - - -# - Statistics Monitoring - - -#log_parser_stats = off -#log_planner_stats = off -#log_executor_stats = off -#log_statement_stats = off - - -#------------------------------------------------------------------------------ -# AUTOVACUUM PARAMETERS -#------------------------------------------------------------------------------ - -#autovacuum = on # Enable autovacuum subprocess? 'on' -# requires track_counts to also be on. -#log_autovacuum_min_duration = -1 # -1 disables, 0 logs all actions and -# their durations, > 0 logs only -# actions running at least this number -# of milliseconds. -#autovacuum_max_workers = 3 # max number of autovacuum subprocesses -# (change requires restart) -#autovacuum_naptime = 1min # time between autovacuum runs -#autovacuum_vacuum_threshold = 50 # min number of row updates before -# vacuum -#autovacuum_analyze_threshold = 50 # min number of row updates before -# analyze -#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum -#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze -#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum -# (change requires restart) -#autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age -# before forced vacuum -# (change requires restart) -#autovacuum_vacuum_cost_delay = 20ms # default vacuum cost delay for -# autovacuum, in milliseconds; -# -1 means use vacuum_cost_delay -#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for -# autovacuum, -1 means use -# vacuum_cost_limit - - -#------------------------------------------------------------------------------ -# CLIENT CONNECTION DEFAULTS -#------------------------------------------------------------------------------ - -# - Statement Behavior - - -#search_path = '"$user",public' # schema names -#default_tablespace = '' # a tablespace name, '' uses the default -#temp_tablespaces = '' # a list of tablespace names, '' uses -# only default tablespace -#check_function_bodies = on -#default_transaction_isolation = 'read committed' -#default_transaction_read_only = off -#default_transaction_deferrable = off -#session_replication_role = 'origin' -#statement_timeout = 0 # in milliseconds, 0 is disabled -#lock_timeout = 0 # in milliseconds, 0 is disabled -#vacuum_freeze_min_age = 50000000 -#vacuum_freeze_table_age = 150000000 -#vacuum_multixact_freeze_min_age = 5000000 -#vacuum_multixact_freeze_table_age = 150000000 -#bytea_output = 'hex' # hex, escape -#xmlbinary = 'base64' -#xmloption = 'content' - -# - Locale and Formatting - - -datestyle = 'iso, mdy' -#intervalstyle = 'postgres' -timezone = 'Europe/Helsinki' -#timezone_abbreviations = 'Default' # Select the set of available time zone -# abbreviations. Currently, there are -# Default -# Australia (historical usage) -# India -# You can create your own file in -# share/timezonesets/. -#extra_float_digits = 0 # min -15, max 3 -#client_encoding = sql_ascii # actually, defaults to database -# encoding - -# These settings are initialized by initdb, but they can be changed. -lc_messages = 'en_US.UTF-8' # locale for system error message -# strings -lc_monetary = 'en_US.UTF-8' # locale for monetary formatting -lc_numeric = 'en_US.UTF-8' # locale for number formatting -lc_time = 'en_US.UTF-8' # locale for time formatting - -# default configuration for text search -default_text_search_config = 'pg_catalog.english' - -# - Other Defaults - - -#dynamic_library_path = '$libdir' -#local_preload_libraries = '' -#session_preload_libraries = '' - - -#------------------------------------------------------------------------------ -# LOCK MANAGEMENT -#------------------------------------------------------------------------------ - -#deadlock_timeout = 1s -#max_locks_per_transaction = 64 # min 10 -# (change requires restart) -# Note: Each lock table slot uses ~270 bytes of shared memory, and there are -# max_locks_per_transaction * (max_connections + max_prepared_transactions) -# lock table slots. -#max_pred_locks_per_transaction = 64 # min 10 -# (change requires restart) - - -#------------------------------------------------------------------------------ -# VERSION/PLATFORM COMPATIBILITY -#------------------------------------------------------------------------------ - -# - Previous PostgreSQL Versions - - -#array_nulls = on -#backslash_quote = safe_encoding # on, off, or safe_encoding -#default_with_oids = off -#escape_string_warning = on -#lo_compat_privileges = off -#quote_all_identifiers = off -#sql_inheritance = on -#standard_conforming_strings = on -#synchronize_seqscans = on - -# - Other Platforms and Clients - - -#transform_null_equals = off - - -#------------------------------------------------------------------------------ -# ERROR HANDLING -#------------------------------------------------------------------------------ - -#exit_on_error = off # terminate session on any error? -#restart_after_crash = on # reinitialize after backend crash? - - -#------------------------------------------------------------------------------ -# CONFIG FILE INCLUDES -#------------------------------------------------------------------------------ - -# These options allow settings to be loaded from files other than the -# default postgresql.conf. - -#include_dir = 'conf.d' # include files ending in '.conf' from -# directory 'conf.d' -#include_if_exists = 'exists.conf' # include file only if it exists -#include = 'special.conf' # include file - - -#------------------------------------------------------------------------------ -# CUSTOMIZED OPTIONS -#------------------------------------------------------------------------------ - -# Add settings for extensions here diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/App.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/App.java index ce1370b18..f2cb83743 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/App.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/App.java @@ -2,9 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) +@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, FlywayAutoConfiguration.class }) public class App { public static final String CONTEXT_PATH = "/sijoittelu-service"; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/external/resource/seuranta/SijoitteluSeurantaResource.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/JatkuvaSijoitteluDAO.java similarity index 66% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/external/resource/seuranta/SijoitteluSeurantaResource.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/JatkuvaSijoitteluDAO.java index f87d7f4c1..fd01a8f56 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/external/resource/seuranta/SijoitteluSeurantaResource.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/JatkuvaSijoitteluDAO.java @@ -1,10 +1,9 @@ -package fi.vm.sade.sijoittelu.jatkuva.external.resource.seuranta; - -import fi.vm.sade.sijoittelu.jatkuva.external.resource.seuranta.dto.SijoitteluDto; +package fi.vm.sade.sijoittelu.jatkuva.dao; +import fi.vm.sade.sijoittelu.jatkuva.dao.dto.SijoitteluDto; import java.util.Collection; -public interface SijoitteluSeurantaResource { +public interface JatkuvaSijoitteluDAO { SijoitteluDto hae(String hakuOid); diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/external/resource/seuranta/dto/SijoitteluDto.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/dto/SijoitteluDto.java similarity index 96% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/external/resource/seuranta/dto/SijoitteluDto.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/dto/SijoitteluDto.java index 07a8956ef..ca41e279c 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/external/resource/seuranta/dto/SijoitteluDto.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/dto/SijoitteluDto.java @@ -1,4 +1,4 @@ -package fi.vm.sade.sijoittelu.jatkuva.external.resource.seuranta.dto; +package fi.vm.sade.sijoittelu.jatkuva.dao.dto; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/impl/JatkuvaSijoitteluDAOImpl.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/impl/JatkuvaSijoitteluDAOImpl.java new file mode 100644 index 000000000..231830041 --- /dev/null +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/impl/JatkuvaSijoitteluDAOImpl.java @@ -0,0 +1,113 @@ +package fi.vm.sade.sijoittelu.jatkuva.dao.impl; + +import fi.vm.sade.sijoittelu.jatkuva.dao.JatkuvaSijoitteluDAO; + +import java.time.Instant; +import java.util.*; + +import fi.vm.sade.sijoittelu.jatkuva.dao.dto.SijoitteluDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Profile; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Service; + +// TODO: clean up implementation +@Service +@Profile({"default", "dev"}) +public class JatkuvaSijoitteluDAOImpl implements JatkuvaSijoitteluDAO { + + private final JdbcTemplate jdbcTemplate; + + private final RowMapper sijoitteluDtoRowMapper = (rs, rowNum) -> + new SijoitteluDto( + rs.getString("haku_oid"), + rs.getBoolean("jatkuva_paalla"), + rs.getTimestamp("viimeksi_ajettu"), + null, + rs.getTimestamp("aloitus"), + rs.getInt("ajotiheys") + ); + + @Autowired + public JatkuvaSijoitteluDAOImpl(@Qualifier("sijoitteluJdbcTemplate") JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public SijoitteluDto hae(String hakuOid) { + try { + return jdbcTemplate.queryForObject("SELECT haku_oid, jatkuva_paalla, viimeksi_ajettu, aloitus, ajotiheys FROM jatkuvat WHERE haku_oid=?", + sijoitteluDtoRowMapper, hakuOid); + } catch (EmptyResultDataAccessException e) { + return null; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public Collection hae() { + try { + return jdbcTemplate.query("SELECT haku_oid, jatkuva_paalla, viimeksi_ajettu, aloitus, ajotiheys FROM jatkuvat", sijoitteluDtoRowMapper); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public SijoitteluDto merkkaaSijoittelunAjossaTila(String hakuOid, boolean tila) { + try { + this.jdbcTemplate.update( + "INSERT INTO jatkuvat " + + "(haku_oid, jatkuva_paalla, viimeksi_ajettu, aloitus, ajotiheys) " + + "VALUES (?, ?, null, null, null) " + + "ON CONFLICT (haku_oid) DO UPDATE SET jatkuva_paalla=?", + hakuOid, tila, tila); + return this.hae(hakuOid); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public SijoitteluDto merkkaaSijoittelunAjetuksi(String hakuOid) { + try { + String now = new Date().toString(); + this.jdbcTemplate.update("INSERT INTO jatkuvat " + + "(haku_oid, jatkuva_paalla, viimeksi_ajettu, aloitus, ajotiheys) " + + "VALUES (?, false, ?::timestamptz, null, null) " + + "ON CONFLICT (haku_oid) DO UPDATE SET viimeksi_ajettu=?::timestamptz", + hakuOid, now, now); + return this.hae(hakuOid); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void poistaSijoittelu(String hakuOid) { + try { + this.jdbcTemplate.update("DELETE FROM jatkuvat WHERE haku_oid=?", hakuOid); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void paivitaSijoittelunAloitusajankohta( + String hakuOid, long aloitusajankohta, int ajotiheys) { + try { + String aloitus = Date.from(Instant.ofEpochMilli(aloitusajankohta)).toString(); + this.jdbcTemplate.update("INSERT INTO jatkuvat " + + "(haku_oid, jatkuva_paalla, viimeksi_ajettu, aloitus, ajotiheys) " + + "VALUES (?, false, null, ?::timestamptz, ?) " + + "ON CONFLICT (haku_oid) DO UPDATE SET aloitus=?::timestamptz, ajotiheys=?", + hakuOid, aloitus, ajotiheys, aloitus, ajotiheys); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/external/resource/seuranta/impl/SijoitteluSeurantaResourceImpl.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/external/resource/seuranta/impl/SijoitteluSeurantaResourceImpl.java deleted file mode 100644 index 6bef26d39..000000000 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/external/resource/seuranta/impl/SijoitteluSeurantaResourceImpl.java +++ /dev/null @@ -1,143 +0,0 @@ -package fi.vm.sade.sijoittelu.jatkuva.external.resource.seuranta.impl; - -import com.google.gson.reflect.TypeToken; -import fi.vm.sade.sijoittelu.jatkuva.external.resource.seuranta.SijoitteluSeurantaResource; -import fi.vm.sade.sijoittelu.jatkuva.external.resource.seuranta.dto.SijoitteluDto; -import fi.vm.sade.sijoittelu.jatkuva.external.resource.viestintapalvelu.RestCasClient; -import fi.vm.sade.sijoittelu.laskenta.util.UrlProperties; -import java.util.Collection; -import java.util.Collections; -import java.util.Optional; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Service; - -// TODO: clean up implementation -@Service -@Profile({"default", "dev"}) -public class SijoitteluSeurantaResourceImpl implements SijoitteluSeurantaResource { - - private final RestCasClient restCasClient; - - private final UrlProperties urlProperties; - - @Autowired - public SijoitteluSeurantaResourceImpl( - @Qualifier("SeurantaCasClient") RestCasClient restCasClient, UrlProperties urlProperties) { - this.restCasClient = restCasClient; - this.urlProperties = urlProperties; - } - ; - - @Override - public SijoitteluDto hae(String hakuOid) { - try { - return this.restCasClient - .get( - this.urlProperties.url("valintalaskentakoostepalvelu.seuranta.rest.url") - + "/sijoittelunseuranta/hae/" - + hakuOid, - new TypeToken() {}, - Collections.emptyMap(), - 10 * 60 * 1000) - .get(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public Collection hae() { - try { - return this.restCasClient - .get( - this.urlProperties.url("valintalaskentakoostepalvelu.seuranta.rest.url") - + "/sijoittelunseuranta/hae", - new TypeToken>() {}, - Collections.emptyMap(), - 10 * 60 * 1000) - .get(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public SijoitteluDto merkkaaSijoittelunAjossaTila(String hakuOid, boolean tila) { - try { - return this.restCasClient - .put( - this.urlProperties.url("valintalaskentakoostepalvelu.seuranta.rest.url") - + "/sijoittelunseuranta/sijoittelu/" - + hakuOid - + "/ajossa/" - + tila, - new TypeToken() {}, - Optional.empty(), - Collections.emptyMap(), - 10 * 60 * 1000) - .get(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public SijoitteluDto merkkaaSijoittelunAjetuksi(String hakuOid) { - try { - return this.restCasClient - .put( - this.urlProperties.url("valintalaskentakoostepalvelu.seuranta.rest.url") - + "/sijoittelunseuranta/sijoittelu/" - + hakuOid, - new TypeToken() {}, - Optional.empty(), - Collections.emptyMap(), - 10 * 60 * 1000) - .get(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public void poistaSijoittelu(String hakuOid) { - try { - this.restCasClient - .delete( - this.urlProperties.url("valintalaskentakoostepalvelu.seuranta.rest.url") - + "/sijoittelunseuranta/sijoittelu/" - + hakuOid, - Collections.emptyMap(), - 10 * 60 * 1000) - .get(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @Override - public void paivitaSijoittelunAloitusajankohta( - String hakuOid, long aloitusajankohta, int ajotiheys) { - try { - this.restCasClient - .put( - this.urlProperties.url("valintalaskentakoostepalvelu.seuranta.rest.url") - + "/sijoittelunseuranta/sijoittelu/" - + hakuOid - + "/paivita" - + "?aloitusajankohta=" - + aloitusajankohta - + "&ajotiheys=" - + ajotiheys, - new TypeToken() {}, - Optional.empty(), - Collections.emptyMap(), - 10 * 60 * 1000) - .get(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/job/AjastettuSijoitteluJob.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/job/AjastettuSijoitteluJob.java index ac90c2ae7..6ee431ab8 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/job/AjastettuSijoitteluJob.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/job/AjastettuSijoitteluJob.java @@ -1,6 +1,6 @@ package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.job; -import fi.vm.sade.sijoittelu.jatkuva.external.resource.seuranta.SijoitteluSeurantaResource; +import fi.vm.sade.sijoittelu.jatkuva.dao.JatkuvaSijoitteluDAO; import fi.vm.sade.sijoittelu.laskenta.service.business.ToteutaSijoitteluService; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; @@ -26,8 +26,8 @@ public void executeInternal(JobExecutionContext context) throws JobExecutionExce (ApplicationContext) context.getScheduler().getContext().get("applicationContext"); ToteutaSijoitteluService toteutaSijoitteluService = applicationContext.getBean(ToteutaSijoitteluService.class); - SijoitteluSeurantaResource sijoittelunSeurantaResource = - applicationContext.getBean(SijoitteluSeurantaResource.class); + JatkuvaSijoitteluDAO sijoittelunSeurantaResource = + applicationContext.getBean(JatkuvaSijoitteluDAO.class); String hakuOid = (String) context.getJobDetail().getJobDataMap().get("hakuOid"); try { diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/resource/SijoitteluAktivointiResource.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/resource/SijoitteluAktivointiResource.java index 6f050787d..067db785e 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/resource/SijoitteluAktivointiResource.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/resource/SijoitteluAktivointiResource.java @@ -3,8 +3,8 @@ import com.google.gson.Gson; import fi.vm.sade.auditlog.Audit; import fi.vm.sade.auditlog.Changes; -import fi.vm.sade.sijoittelu.jatkuva.external.resource.seuranta.SijoitteluSeurantaResource; -import fi.vm.sade.sijoittelu.jatkuva.external.resource.seuranta.dto.SijoitteluDto; +import fi.vm.sade.sijoittelu.jatkuva.dao.JatkuvaSijoitteluDAO; +import fi.vm.sade.sijoittelu.jatkuva.dao.dto.SijoitteluDto; import fi.vm.sade.sijoittelu.jatkuva.external.resource.tarjonta.TarjontaAsyncResource; import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.dto.AjastettuSijoitteluInfo; import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.dto.Sijoittelu; @@ -62,7 +62,7 @@ public class SijoitteluAktivointiResource { @Autowired private HakuParametritService hakuParametritService; - @Autowired private SijoitteluSeurantaResource sijoittelunSeurantaResource; + @Autowired private JatkuvaSijoitteluDAO sijoittelunSeurantaResource; @Autowired private SijoittelunValvonta sijoittelunValvonta; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/JatkuvaSijoitteluRouteImpl.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/JatkuvaSijoitteluRouteImpl.java index 99449b312..4a8d74590 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/JatkuvaSijoitteluRouteImpl.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/JatkuvaSijoitteluRouteImpl.java @@ -1,7 +1,7 @@ package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.route.impl; -import fi.vm.sade.sijoittelu.jatkuva.external.resource.seuranta.SijoitteluSeurantaResource; -import fi.vm.sade.sijoittelu.jatkuva.external.resource.seuranta.dto.SijoitteluDto; +import fi.vm.sade.sijoittelu.jatkuva.dao.JatkuvaSijoitteluDAO; +import fi.vm.sade.sijoittelu.jatkuva.dao.dto.SijoitteluDto; import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.dto.AjastettuSijoitteluInfo; import fi.vm.sade.sijoittelu.jatkuva.util.Formatter; import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.job.AjastettuSijoitteluJob; @@ -24,7 +24,7 @@ public class JatkuvaSijoitteluRouteImpl implements JatkuvaSijoittelu { private static final Logger LOG = LoggerFactory.getLogger(JatkuvaSijoitteluRouteImpl.class); - private final SijoitteluSeurantaResource sijoittelunSeurantaResource; + private final JatkuvaSijoitteluDAO sijoittelunSeurantaResource; private final int VAKIO_AJOTIHEYS = 24; private final Timer timer; private final Scheduler sijoitteluScheduler; @@ -56,7 +56,7 @@ public JatkuvaSijoitteluRouteImpl( @Value("${jatkuvasijoittelu.autostart:true}") boolean autoStartup, @Value("${valintalaskentakoostepalvelu.jatkuvasijoittelu.intervalMinutes:5}") long jatkuvaSijoitteluPollIntervalInMinutes, - SijoitteluSeurantaResource sijoittelunSeurantaResource, + JatkuvaSijoitteluDAO sijoittelunSeurantaResource, SchedulerFactoryBean schedulerFactoryBean) { this.sijoittelunSeurantaResource = sijoittelunSeurantaResource; this.timer = diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteConfig.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteConfig.java index b5f217771..e2fdbe62b 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteConfig.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteConfig.java @@ -1,6 +1,6 @@ package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.route.impl; -import fi.vm.sade.sijoittelu.jatkuva.external.resource.seuranta.SijoitteluSeurantaResource; +import fi.vm.sade.sijoittelu.jatkuva.dao.JatkuvaSijoitteluDAO; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -16,12 +16,12 @@ public JatkuvaSijoitteluRouteImpl getJatkuvaSijoitteluRouteImpl( @Value("${jatkuvasijoittelu.autostart:true}") boolean autoStartup, @Value("${valintalaskentakoostepalvelu.jatkuvasijoittelu.intervalMinutes:5}") long jatkuvaSijoitteluPollIntervalInMinutes, - SijoitteluSeurantaResource sijoitteluSeurantaResource, + JatkuvaSijoitteluDAO jatkuvaSijoitteluDAO, SchedulerFactoryBean schedulerFactoryBean) { return new JatkuvaSijoitteluRouteImpl( autoStartup, jatkuvaSijoitteluPollIntervalInMinutes, - sijoitteluSeurantaResource, + jatkuvaSijoitteluDAO, schedulerFactoryBean); } diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluDatabaseConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluDatabaseConfiguration.java new file mode 100644 index 000000000..cf109decf --- /dev/null +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluDatabaseConfiguration.java @@ -0,0 +1,40 @@ +package fi.vm.sade.sijoittelu.laskenta.configuration; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; + +import javax.sql.DataSource; +import java.util.*; + +@Configuration +public class SijoitteluDatabaseConfiguration { + + @Bean("sijoitteluDataSource") + public DataSource sijoitteluDataSource( + @Value("${sijoittelu.sijoittelu.postgresql.url}") final String url, + @Value("${sijoittelu.sijoittelu.postgresql.username}") final String user, + @Value("${sijoittelu.sijoittelu.postgresql.password}") final String password, + @Value("${sijoittelu.sijoittelu.postgresql.driver}") final String driverClassName) { + final HikariConfig config = new HikariConfig(); + config.setConnectionTestQuery("SELECT 1"); + config.setJdbcUrl(url); + final Properties dsProperties = new Properties(); + dsProperties.setProperty("url", url); + dsProperties.setProperty("user", user); + dsProperties.setProperty("password", password); + config.setDataSourceProperties(dsProperties); + if(!driverClassName.equals("")) config.setDriverClassName(driverClassName); + return new HikariDataSource(config); + } + + @Bean("sijoitteluJdbcTemplate") + JdbcTemplate sijoitteluJdbcTemplate( + @Qualifier("sijoitteluDataSource") DataSource sijoitteluDataSource) { + return new JdbcTemplate(sijoitteluDataSource); + } +} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluServiceConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluServiceConfiguration.java index 3ff8539f1..90b104f83 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluServiceConfiguration.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluServiceConfiguration.java @@ -8,7 +8,12 @@ import fi.vm.sade.valintalaskenta.tulos.logging.LaskentaAuditLogImpl; import fi.vm.sade.valintalaskenta.tulos.mapping.ValintalaskentaModelMapper; import fi.vm.sade.valintalaskenta.tulos.service.impl.JarjestyskriteerihistoriaServiceImpl; +import org.flywaydb.core.Flyway; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.*; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.scheduling.annotation.EnableAsync; @@ -22,10 +27,14 @@ }, excludeFilters = { @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=JarjestyskriteerihistoriaServiceImpl.class)}) @Profile("!test") -public class SijoitteluServiceConfiguration { +public class SijoitteluServiceConfiguration implements InitializingBean { public static final String CALLER_ID = "1.2.246.562.10.00000000001.sijoittelu.sijoittelu-service"; + @Autowired + @Qualifier("sijoitteluJdbcTemplate") + JdbcTemplate jdbcTemplate; + @Bean public Audit audit() { return new Audit(new AuditLogger(), "sijoittelu", ApplicationType.VIRKAILIJA); } @@ -54,4 +63,14 @@ public void addCorsMappings(CorsRegistry registry) { }; } + @Override + public void afterPropertiesSet() throws Exception { + Flyway flyway = Flyway.configure() + .schemas("public") + .dataSource(jdbcTemplate.getDataSource()) + .table("schema_version") + .locations("/db/migration") + .load(); + flyway.migrate(); + } } diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/DatabaseConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/ValintalaskentaDatabaseConfiguration.java similarity index 89% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/DatabaseConfiguration.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/ValintalaskentaDatabaseConfiguration.java index da51d5e0f..499c941e8 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/DatabaseConfiguration.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/ValintalaskentaDatabaseConfiguration.java @@ -8,6 +8,7 @@ import fi.vm.sade.valintalaskenta.domain.valinta.JarjestyskriteeritulosContainer; import fi.vm.sade.valintalaskenta.domain.valinta.SyotettyArvoContainer; import org.postgresql.util.PGobject; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @@ -38,18 +39,18 @@ }, transactionManagerRef = "valintaLaskentaTransactionManager", jdbcOperationsRef = "valintalaskentaNamedParameterJdbcOperations") -public class DatabaseConfiguration extends AbstractJdbcConfiguration { +public class ValintalaskentaDatabaseConfiguration extends AbstractJdbcConfiguration { private final ApplicationContext applicationContext; private static final List> JSON_CLASSES = asList(SyotettyArvoContainer.class, FunktioTulosContainer.class, JarjestyskriteeritulosContainer.class); - DatabaseConfiguration(ApplicationContext applicationContext) { + ValintalaskentaDatabaseConfiguration(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } - @Bean + @Bean("valintalaskentaDataSource") public DataSource dataSourceValintalaskenta( @Value("${sijoittelu.valintalaskenta.postgresql.maxactive}") final String maxPoolSize, @Value("${sijoittelu.valintalaskenta.postgresql.maxwait}") final String maxWait, @@ -79,18 +80,20 @@ public DataSource dataSourceValintalaskenta( return new HikariDataSource(config); } - @Bean - public JdbcTemplate jdbcTemplate(DataSource dataSourceValintalaskenta) { + @Bean("valintalaskentaJdbcTemplate") + public JdbcTemplate jdbcTemplate(@Qualifier("valintalaskentaDataSource") DataSource dataSourceValintalaskenta) { return new JdbcTemplate(dataSourceValintalaskenta); } - @Bean - NamedParameterJdbcOperations valintalaskentaNamedParameterJdbcOperations(DataSource dataSourceValintalaskenta) { + @Bean("valintalaskentaNamedParameterJdbcOperations") + NamedParameterJdbcOperations valintalaskentaNamedParameterJdbcOperations( + @Qualifier("valintalaskentaDataSource") DataSource dataSourceValintalaskenta) { return new NamedParameterJdbcTemplate(dataSourceValintalaskenta); } - @Bean - TransactionManager valintaLaskentaTransactionManager(DataSource dataSourceValintalaskenta) { + @Bean("valintaLaskentaTransactionManager") + TransactionManager valintaLaskentaTransactionManager( + @Qualifier("valintalaskentaDataSource") DataSource dataSourceValintalaskenta) { return new DataSourceTransactionManager(dataSourceValintalaskenta); } diff --git a/sijoittelu-service/src/main/resources/application.yml b/sijoittelu-service/src/main/resources/application.yml index 42e945610..4295cbf23 100644 --- a/sijoittelu-service/src/main/resources/application.yml +++ b/sijoittelu-service/src/main/resources/application.yml @@ -1,6 +1,3 @@ -spring: - flyway: - enabled: false logging: level: fi.vm.sade.javautils.nio.cas: warn # CasClient näyttää tunkevan INFO-entryyn koko responsen joten filtteröidään ne pois \ No newline at end of file diff --git a/sijoittelu-service/src/main/resources/db/migration/V20240419000000__add_jatkuva_sijoittelu_schema.sql b/sijoittelu-service/src/main/resources/db/migration/V20240419000000__add_jatkuva_sijoittelu_schema.sql new file mode 100644 index 000000000..11f887b06 --- /dev/null +++ b/sijoittelu-service/src/main/resources/db/migration/V20240419000000__add_jatkuva_sijoittelu_schema.sql @@ -0,0 +1,18 @@ +CREATE TABLE IF NOT EXISTS jatkuvat ( + haku_oid TEXT PRIMARY KEY, + jatkuva_paalla BOOLEAN, + viimeksi_ajettu TIMESTAMP, + aloitus TIMESTAMP, + ajotiheys INTEGER +); + +CREATE TABLE IF NOT EXISTS jatkuva_virheet ( + haku_oid TEXT, + aika TIMESTAMP, + virhe TEXT, + CONSTRAINT fk_haku_oid FOREIGN KEY (haku_oid) REFERENCES jatkuvat(haku_oid) ON DELETE CASCADE +); + +DROP INDEX IF EXISTS jatkuva_virheet_haku_oid; + +CREATE INDEX jatkuva_virheet_haku_oid ON jatkuva_virheet (haku_oid); diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/DevApp.java b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/DevApp.java index 9003e361f..0ebdbf029 100644 --- a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/DevApp.java +++ b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/DevApp.java @@ -30,7 +30,7 @@ public static void main(String[] args) { System.setProperty("web.url.cas", String.format("https://virkailija.%sopintopolku.fi/cas", ENVIRONMENT)); // postgres - System.setProperty("valintarekisteri.db.url", "jdbc:postgresql://localhost:5433/sijoittelu"); + System.setProperty("valintarekisteri.db.url", "jdbc:postgresql://localhost:5433/valintarekisteri"); System.setProperty("valintarekisteri.db.user", "oph"); System.setProperty("valintarekisteri.db.password", "oph"); @@ -39,6 +39,11 @@ public static void main(String[] args) { System.setProperty("sijoittelu.valintalaskenta.postgresql.maxlifetimemillis", "60000"); System.setProperty("sijoittelu.valintalaskenta.postgresql.readonly", "true"); + System.setProperty("sijoittelu.sijoittelu.postgresql.url", "jdbc:postgresql://localhost:5433/sijoittelu"); + System.setProperty("sijoittelu.sijoittelu.postgresql.username", "oph"); + System.setProperty("sijoittelu.sijoittelu.postgresql.password", "oph"); + System.setProperty("sijoittelu.sijoittelu.postgresql.driver", ""); + // ulkoiset palvelut System.setProperty("host.virkailija", String.format("virkailija.%sopintopolku.fi", ENVIRONMENT)); System.setProperty("kayttooikeus-service.userDetails.byUsername", String.format("http://alb.%sopintopolku.fi:8888/kayttooikeus-service/userDetails/$1", ENVIRONMENT)); diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/testing/AbstractIntegrationTest.java b/sijoittelu-service/src/test/java/fi/vm/sade/testing/AbstractIntegrationTest.java index 5748740b6..e4fb3a200 100644 --- a/sijoittelu-service/src/test/java/fi/vm/sade/testing/AbstractIntegrationTest.java +++ b/sijoittelu-service/src/test/java/fi/vm/sade/testing/AbstractIntegrationTest.java @@ -3,6 +3,7 @@ import fi.vm.sade.sijoittelu.App; import org.junit.jupiter.api.AfterEach; 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.web.server.LocalServerPort; import org.springframework.context.annotation.*; @@ -24,6 +25,7 @@ public abstract class AbstractIntegrationTest { private final static List TABLES = List.of("jonosija", "muokattu_jonosija", "hakijaryhma", "valinnanvaihe", "valintatapajono"); @Autowired + @Qualifier("valintalaskentaJdbcTemplate") private JdbcTemplate jdbcTemplate; @LocalServerPort protected Integer port; diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/testing/TestConfigurationWithMocks.java b/sijoittelu-service/src/test/java/fi/vm/sade/testing/TestConfigurationWithMocks.java index 5078fe590..496263077 100644 --- a/sijoittelu-service/src/test/java/fi/vm/sade/testing/TestConfigurationWithMocks.java +++ b/sijoittelu-service/src/test/java/fi/vm/sade/testing/TestConfigurationWithMocks.java @@ -14,10 +14,15 @@ import fi.vm.sade.valintalaskenta.tulos.logging.LaskentaAuditLogImpl; import fi.vm.sade.valintalaskenta.tulos.mapping.ValintalaskentaModelMapper; import fi.vm.sade.valintalaskenta.tulos.service.impl.JarjestyskriteerihistoriaServiceImpl; +import org.flywaydb.core.Flyway; import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.*; +import javax.sql.DataSource; + @TestConfiguration @ComponentScan(basePackages = { "fi.vm.sade.valintalaskenta.tulos.dao", @@ -28,6 +33,23 @@ @Profile("test") public class TestConfigurationWithMocks { + @Autowired + @Qualifier("valintalaskentaDataSource") + DataSource dataSource; + + public static class ValintalaskentaFlywayMigrationDone {} + + @Bean + public ValintalaskentaFlywayMigrationDone doValintalaskentaFlywayMigration() { + Flyway flyway = Flyway.configure() + .schemas("public") + .dataSource(dataSource) + .locations("filesystem:../../valintalaskenta/valintalaskenta-laskenta-service/src/main/resources/db/migration") + .load(); + flyway.migrate(); + return new ValintalaskentaFlywayMigrationDone(); + } + @Bean public ValintaperusteetResource valintaperusteetResource() { return Mockito.mock(ValintaperusteetResource.class); } diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/util/TempDockerDB.java b/sijoittelu-service/src/test/java/fi/vm/sade/util/TempDockerDB.java index c38b5622d..402125a6b 100644 --- a/sijoittelu-service/src/test/java/fi/vm/sade/util/TempDockerDB.java +++ b/sijoittelu-service/src/test/java/fi/vm/sade/util/TempDockerDB.java @@ -9,8 +9,6 @@ public class TempDockerDB { private static final String dbName = "sijoittelu"; private static final String containerName = "sijoittelu-postgres"; - private static final int port = 5433; - private static final int startStopRetries = 100; private static final int startStopRetryIntervalMillis = 100; @@ -24,14 +22,14 @@ private static boolean databaseIsRunning() { }; private static void startDatabaseContainer() { - LOG.info("Starting PostgreSQL container (localhost:" + port + "):"); + LOG.info("Starting PostgreSQL container"); try { - Process p = Runtime.getRuntime().exec("docker start " + containerName); + Process p = Runtime.getRuntime().exec("docker-compose -f sijoittelu-service/postgresql/docker-compose.yml up -d"); p.waitFor(); - String error = new String(p.getErrorStream().readAllBytes()); if (!tryTimes(() -> databaseIsRunning(), startStopRetries, startStopRetryIntervalMillis)) { - throw new RuntimeException("postgres not accepting connections in port " + port); + String error = new String(p.getErrorStream().readAllBytes()); + throw new RuntimeException("postgres not accepting connections: " + error); } } catch(Exception e) { throw new RuntimeException(e); @@ -51,7 +49,7 @@ public static void start() { private static void stop() { try { LOG.info("Killing PostgreSQL container"); - Process p = Runtime.getRuntime().exec("docker stop " + containerName); + Process p = Runtime.getRuntime().exec("docker-compose -f sijoittelu-service/postgresql/docker-compose.yml stop"); p.waitFor(); } catch(Exception e) { LOG.warn("PostgreSQL container didn't stop gracefully"); diff --git a/sijoittelu-service/src/test/resources/application.yml b/sijoittelu-service/src/test/resources/application.yml index 54cd9adb4..574e36af3 100644 --- a/sijoittelu-service/src/test/resources/application.yml +++ b/sijoittelu-service/src/test/resources/application.yml @@ -1,18 +1,21 @@ spring: main: allow-bean-definition-overriding: true - flyway: - locations: filesystem:../../valintalaskenta/valintalaskenta-laskenta-service/src/main/resources/db/migration - enabled: true test: context: cache: maxSize: 2 sijoittelu: + sijoittelu: + postgresql: + url: jdbc:tc:postgresql:15.4:///sijoittelu_test_database + username: user + password: password + driver: org.testcontainers.jdbc.ContainerDatabaseDriver valintalaskenta: postgresql: - url: jdbc:tc:postgresql:15.4:///test_database + url: jdbc:tc:postgresql:15.4:///valintalaskenta_test_database user: user password: password maxactive: 10 diff --git a/src/main/resources/oph-configuration/common.properties.template b/src/main/resources/oph-configuration/common.properties.template index 4baf6588e..cc829400e 100644 --- a/src/main/resources/oph-configuration/common.properties.template +++ b/src/main/resources/oph-configuration/common.properties.template @@ -88,4 +88,4 @@ sijoittelu.email.smtp.password={{ sijoittelu_email_smtp_password | default('') } sijoittelu.email.smtp.use_tls={{ sijoittelu_email_smtp_use_tls | default('false') }} sijoittelu.email.smtp.toinen_aste_emails={{ sijoittelu_email_smtp_toinen_aste_emails | default('') }} sijoittelu.email.smtp.kk_emails={{ sijoittelu_email_smtp_kk_emails | default('') }} -sijoittelu.email.smtp.use_authentication={{ sijoittelu_email_smtp_use_authentication | default('false') }} +sijoittelu.email.smtp.use_authentication={{ sijoittelu_email_smtp_use_authentication | default('false') }} \ No newline at end of file diff --git a/src/main/resources/oph-configuration/sijoittelu-service.properties.template b/src/main/resources/oph-configuration/sijoittelu-service.properties.template index 1d306aebf..33a1ee1d5 100644 --- a/src/main/resources/oph-configuration/sijoittelu-service.properties.template +++ b/src/main/resources/oph-configuration/sijoittelu-service.properties.template @@ -8,6 +8,11 @@ cas-service.service=https://{{host_virkailija}}/sijoittelu-service cas-service.sendRenew=false cas-service.key=sijoittelu-service +sijoittelu.sijoittelu.postgresql.username={{postgres_app_user}} +sijoittelu.sijoittelu.postgresql.password={{host_postgresql_sijoittelu_app_password}} +sijoittelu.sijoittelu.postgresql.url=jdbc:postgresql://{{host_postgresql_sijoittelu}}/sijoittelu +sijoittelu.sijoittelu.postgresql.driver=org.postgresql.Driver + sijoittelu.valintalaskenta.postgresql.url=jdbc:postgresql://{{host_postgresql_valintalaskenta}}:{{port_postgresql}}/valintalaskenta?ApplicationName=sijoittelu-service sijoittelu.valintalaskenta.postgresql.user={{postgres_app_user}} sijoittelu.valintalaskenta.postgresql.password={{host_postgresql_valintalaskenta_app_password}} From 909e498453dd990878c4191d83178fff040e44b3 Mon Sep 17 00:00:00 2001 From: Santeri Korri Date: Mon, 22 Apr 2024 10:46:36 +0300 Subject: [PATCH 2/5] OK-493 Migroidaan jatkuvat sijoittelut seurantapalvelusta --- pom.xml | 6 +- sijoittelu-service/pom.xml | 1 - ...01__LueJatkuvatSijoittelutSeurannasta.java | 74 +++++++++++++++++++ .../route/impl/SijoitteluRouteConfig.java | 6 +- .../configuration/FlywayConfiguration.java | 52 +++++++++++++ .../SijoitteluServiceConfiguration.java | 22 +----- ...9000000__add_jatkuva_sijoittelu_schema.sql | 2 +- .../vm/sade/sijoittelu/HakijaryhmaTest.java | 6 +- .../KaikkiEhdonTayttavatHyvaksytaanTest.java | 2 + .../sijoittelu/SijoitteluBusinessTest.java | 2 + .../sijoittelu/SijoitteluMontaJonoaTest.java | 11 +-- .../fi/vm/sade/sijoittelu/SijoitteluTest.java | 6 +- .../vm/sade/sijoittelu/VastaanottoTest.java | 7 +- 13 files changed, 149 insertions(+), 48 deletions(-) create mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/flyway/V20240419000001__LueJatkuvatSijoittelutSeurannasta.java create mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/FlywayConfiguration.java diff --git a/pom.xml b/pom.xml index b8890b704..e5cdb8601 100644 --- a/pom.xml +++ b/pom.xml @@ -48,14 +48,14 @@ 5.18-SNAPSHOT 6.2.4.Final 2.7.14 - + - + org.flywaydb flyway-core - 3.2.1 + 9.22.0 com.sun.activation diff --git a/sijoittelu-service/pom.xml b/sijoittelu-service/pom.xml index efd4a501a..670f73e5a 100644 --- a/sijoittelu-service/pom.xml +++ b/sijoittelu-service/pom.xml @@ -109,7 +109,6 @@ org.flywaydb flyway-core - 9.22.0 diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/flyway/V20240419000001__LueJatkuvatSijoittelutSeurannasta.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/flyway/V20240419000001__LueJatkuvatSijoittelutSeurannasta.java new file mode 100644 index 000000000..05f210284 --- /dev/null +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/flyway/V20240419000001__LueJatkuvatSijoittelutSeurannasta.java @@ -0,0 +1,74 @@ +package fi.vm.sade.sijoittelu.flyway; + +import com.google.gson.reflect.TypeToken; +import fi.vm.sade.sijoittelu.jatkuva.dao.dto.SijoitteluDto; +import fi.vm.sade.sijoittelu.jatkuva.external.resource.viestintapalvelu.RestCasClient; +import fi.vm.sade.sijoittelu.laskenta.util.UrlProperties; +import org.flywaydb.core.api.migration.BaseJavaMigration; +import org.flywaydb.core.api.migration.Context; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.SingleConnectionDataSource; + +import java.util.Collection; +import java.util.Collections; +import java.util.regex.Pattern; + +public class V20240419000001__LueJatkuvatSijoittelutSeurannasta extends BaseJavaMigration { + + private static final Logger LOG = LoggerFactory.getLogger(V20240419000001__LueJatkuvatSijoittelutSeurannasta.class); + + private static RestCasClient seurantaCasClient; + private static UrlProperties urlProperties; + + private static boolean isTest; + + // ainakin hahtuvalla seurantapalvelu antaa ulos osittain täyttä roskaa, joten suodatetaan sijoittelut + // joilla validi oid + private static final Pattern OID_PATTERN = Pattern.compile("^[0-9]+(\\.[0-9]+)*$"); + + public static void setDependencies(UrlProperties properties, RestCasClient client, boolean test) { + urlProperties = properties; + seurantaCasClient = client; + isTest = test; + } + + public Collection hae() { + try { + return seurantaCasClient + .get( + urlProperties.url("valintalaskentakoostepalvelu.seuranta.rest.url") + + "/sijoittelunseuranta/hae", + new TypeToken>() {}, + Collections.emptyMap(), + 10 * 60 * 1000) + .get(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public void migrate(Context context) { + if(isTest) { + LOG.warn("Flyway migration skipped because we are running tests"); + } else { + JdbcTemplate template = new JdbcTemplate(); + template.setDataSource(new SingleConnectionDataSource(context.getConnection(), true)); + for(SijoitteluDto sijoitteluDto : this.hae()) { + if(OID_PATTERN.matcher(sijoitteluDto.getHakuOid()).matches()) { + template.update( + "INSERT INTO jatkuvat " + + "(haku_oid, jatkuva_paalla, viimeksi_ajettu, aloitus, ajotiheys) " + + "VALUES (?, ?, ?::timestamptz, ?::timestamptz, ?)", + sijoitteluDto.getHakuOid(), + sijoitteluDto.isAjossa(), + sijoitteluDto.getViimeksiAjettu(), + sijoitteluDto.getAloitusajankohta(), + sijoitteluDto.getAjotiheys()); + } + } + } + } +} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteConfig.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteConfig.java index e2fdbe62b..517778b97 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteConfig.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteConfig.java @@ -1,18 +1,22 @@ package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.route.impl; import fi.vm.sade.sijoittelu.jatkuva.dao.JatkuvaSijoitteluDAO; +import fi.vm.sade.sijoittelu.laskenta.configuration.FlywayConfiguration; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.scheduling.quartz.SchedulerFactoryBean; -@Profile("default") +@Profile({"default", "dev"}) @Configuration public class SijoitteluRouteConfig { @Bean public JatkuvaSijoitteluRouteImpl getJatkuvaSijoitteluRouteImpl( + // riippuvuus Flyway-migraatioihin jotta tätä beania ei luoda ennen kuin jatkuvien sijoitteluiden migraatio + // seurantapalvelusta ajettu. Tämän voin refaktoroida pois kun migraatio onnistuneesti suoritettu. + FlywayConfiguration.FlywayMigrationDone flywayMigrationDone, @Value("${jatkuvasijoittelu.autostart:true}") boolean autoStartup, @Value("${valintalaskentakoostepalvelu.jatkuvasijoittelu.intervalMinutes:5}") long jatkuvaSijoitteluPollIntervalInMinutes, diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/FlywayConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/FlywayConfiguration.java new file mode 100644 index 000000000..739cfd58e --- /dev/null +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/FlywayConfiguration.java @@ -0,0 +1,52 @@ +package fi.vm.sade.sijoittelu.laskenta.configuration; + +import fi.vm.sade.sijoittelu.flyway.V20240419000001__LueJatkuvatSijoittelutSeurannasta; +import fi.vm.sade.sijoittelu.jatkuva.external.resource.viestintapalvelu.RestCasClient; +import fi.vm.sade.sijoittelu.laskenta.util.UrlProperties; +import org.flywaydb.core.Flyway; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +import javax.sql.DataSource; +import java.util.Arrays; + +@Configuration +public class FlywayConfiguration { + + @Autowired + @Qualifier("sijoitteluDataSource") + DataSource sijoitteluDataSource; + + @Autowired(required = false) + @Qualifier("SeurantaCasClient") + RestCasClient seurantaCasClient; + + @Autowired + UrlProperties urlProperties; + + @Autowired + Environment environment; + + public static class FlywayMigrationDone {} + + private boolean isTest() { + return Arrays.stream(environment.getActiveProfiles()).filter(p -> p.equals("test")).findFirst().isPresent(); + } + + @Bean + public FlywayMigrationDone doFlywayMigration() { + V20240419000001__LueJatkuvatSijoittelutSeurannasta.setDependencies(this.urlProperties, this.seurantaCasClient, isTest()); + + Flyway flyway = Flyway.configure() + .schemas("public") + .dataSource(this.sijoitteluDataSource) + .locations("/db/migration", "fi/vm/sade/sijoittelu/flyway") + .load(); + flyway.migrate(); + + return new FlywayMigrationDone(); + } +} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluServiceConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluServiceConfiguration.java index 90b104f83..9d8133c08 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluServiceConfiguration.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluServiceConfiguration.java @@ -8,12 +8,7 @@ import fi.vm.sade.valintalaskenta.tulos.logging.LaskentaAuditLogImpl; import fi.vm.sade.valintalaskenta.tulos.mapping.ValintalaskentaModelMapper; import fi.vm.sade.valintalaskenta.tulos.service.impl.JarjestyskriteerihistoriaServiceImpl; -import org.flywaydb.core.Flyway; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.*; -import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.scheduling.annotation.EnableAsync; @@ -27,14 +22,10 @@ }, excludeFilters = { @ComponentScan.Filter(type=FilterType.ASSIGNABLE_TYPE, value=JarjestyskriteerihistoriaServiceImpl.class)}) @Profile("!test") -public class SijoitteluServiceConfiguration implements InitializingBean { +public class SijoitteluServiceConfiguration { public static final String CALLER_ID = "1.2.246.562.10.00000000001.sijoittelu.sijoittelu-service"; - @Autowired - @Qualifier("sijoitteluJdbcTemplate") - JdbcTemplate jdbcTemplate; - @Bean public Audit audit() { return new Audit(new AuditLogger(), "sijoittelu", ApplicationType.VIRKAILIJA); } @@ -62,15 +53,4 @@ public void addCorsMappings(CorsRegistry registry) { } }; } - - @Override - public void afterPropertiesSet() throws Exception { - Flyway flyway = Flyway.configure() - .schemas("public") - .dataSource(jdbcTemplate.getDataSource()) - .table("schema_version") - .locations("/db/migration") - .load(); - flyway.migrate(); - } } diff --git a/sijoittelu-service/src/main/resources/db/migration/V20240419000000__add_jatkuva_sijoittelu_schema.sql b/sijoittelu-service/src/main/resources/db/migration/V20240419000000__add_jatkuva_sijoittelu_schema.sql index 11f887b06..0c2e03d89 100644 --- a/sijoittelu-service/src/main/resources/db/migration/V20240419000000__add_jatkuva_sijoittelu_schema.sql +++ b/sijoittelu-service/src/main/resources/db/migration/V20240419000000__add_jatkuva_sijoittelu_schema.sql @@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS jatkuvat ( ); CREATE TABLE IF NOT EXISTS jatkuva_virheet ( - haku_oid TEXT, + haku_oid TEXT NOT NULL, aika TIMESTAMP, virhe TEXT, CONSTRAINT fk_haku_oid FOREIGN KEY (haku_oid) REFERENCES jatkuvat(haku_oid) ON DELETE CASCADE diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/HakijaryhmaTest.java b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/HakijaryhmaTest.java index c2919a659..f371c801f 100644 --- a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/HakijaryhmaTest.java +++ b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/HakijaryhmaTest.java @@ -19,7 +19,6 @@ import fi.vm.sade.testing.AbstractIntegrationTest; import fi.vm.sade.valintalaskenta.domain.dto.valintatieto.HakuDTO; import fi.vm.sade.valintalaskenta.domain.valinta.Hakijaryhma; -import fi.vm.sade.valintalaskenta.domain.valinta.Jonosija; import fi.vm.sade.valintalaskenta.tulos.service.impl.ValintatietoService; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; @@ -28,12 +27,11 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; -import fi.vm.sade.valintalaskenta.domain.testdata.TestEntityDataUtil; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.SqlConfig; +import org.springframework.test.context.ActiveProfiles; import java.time.*; -import java.time.temporal.TemporalAccessor; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -41,8 +39,10 @@ import java.util.List; import java.util.stream.Collectors; +@ActiveProfiles("test") public class HakijaryhmaTest extends AbstractIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(HakijaryhmaTest.class); + @Autowired private ValintatietoService valintatietoService; diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/KaikkiEhdonTayttavatHyvaksytaanTest.java b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/KaikkiEhdonTayttavatHyvaksytaanTest.java index fe52c543c..9ac1aad08 100644 --- a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/KaikkiEhdonTayttavatHyvaksytaanTest.java +++ b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/KaikkiEhdonTayttavatHyvaksytaanTest.java @@ -17,6 +17,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -28,6 +29,7 @@ import java.util.List; import java.util.stream.Collectors; +@ActiveProfiles("test") public class KaikkiEhdonTayttavatHyvaksytaanTest extends AbstractIntegrationTest { @Autowired diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/SijoitteluBusinessTest.java b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/SijoitteluBusinessTest.java index aa158ed0b..f3a28125d 100644 --- a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/SijoitteluBusinessTest.java +++ b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/SijoitteluBusinessTest.java @@ -34,6 +34,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.util.ReflectionTestUtils; import java.time.Instant; @@ -45,6 +46,7 @@ import java.util.Set; import java.util.stream.Collectors; +@ActiveProfiles("test") public class SijoitteluBusinessTest extends AbstractIntegrationTest { @Autowired diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/SijoitteluMontaJonoaTest.java b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/SijoitteluMontaJonoaTest.java index 7fcd54f62..e3d0196a8 100644 --- a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/SijoitteluMontaJonoaTest.java +++ b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/SijoitteluMontaJonoaTest.java @@ -3,7 +3,6 @@ import com.google.common.collect.Lists; import fi.vm.sade.testing.AbstractIntegrationTest; -import fi.vm.sade.testing.TestConfigurationWithMocks; import fi.vm.sade.sijoittelu.batch.logic.impl.DomainConverter; import fi.vm.sade.sijoittelu.batch.logic.impl.algorithm.PrintHelper; import fi.vm.sade.sijoittelu.batch.logic.impl.algorithm.SijoitteluConfiguration; @@ -24,16 +23,12 @@ import fi.vm.sade.valintalaskenta.domain.dto.valintatieto.HakuDTO; import fi.vm.sade.valintalaskenta.tulos.service.impl.ValintatietoService; import org.apache.commons.lang3.time.DateUtils; -import org.joda.time.DateTime; import org.junit.jupiter.api.Assertions; 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.context.ApplicationContext; -import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.jdbc.Sql; -import org.springframework.test.context.junit.jupiter.SpringExtension; import java.time.*; import java.util.ArrayList; @@ -43,14 +38,12 @@ import java.util.List; import java.util.stream.Collectors; +@ActiveProfiles("test") public class SijoitteluMontaJonoaTest extends AbstractIntegrationTest { @Autowired private ValintatietoService valintatietoService; - @Autowired - private ApplicationContext applicationContext; - @Test @Sql("monta_jonoa.sql") public void testSijoitteluMontaJonoa() { diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/SijoitteluTest.java b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/SijoitteluTest.java index e741fe3f2..47abda6b3 100644 --- a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/SijoitteluTest.java +++ b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/SijoitteluTest.java @@ -3,7 +3,6 @@ import com.google.common.collect.ImmutableList; import fi.vm.sade.testing.AbstractIntegrationTest; -import fi.vm.sade.testing.TestConfigurationWithMocks; import fi.vm.sade.sijoittelu.batch.logic.impl.algorithm.TestHelper; import fi.vm.sade.sijoittelu.batch.logic.impl.algorithm.util.SijoitteluAlgorithmUtil; import fi.vm.sade.sijoittelu.domain.HakemuksenTila; @@ -12,11 +11,9 @@ import fi.vm.sade.sijoittelu.domain.Valintatapajono; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.ActiveProfiles; import java.util.ArrayList; import java.util.Collections; @@ -24,6 +21,7 @@ import java.util.List; import java.util.Map; +@ActiveProfiles("test") public class SijoitteluTest extends AbstractIntegrationTest { private static final Logger LOG = LoggerFactory.getLogger(SijoitteluTest.class); diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/VastaanottoTest.java b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/VastaanottoTest.java index 4e86be14b..787539420 100644 --- a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/VastaanottoTest.java +++ b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/VastaanottoTest.java @@ -1,7 +1,6 @@ package fi.vm.sade.sijoittelu; import fi.vm.sade.testing.AbstractIntegrationTest; -import fi.vm.sade.testing.TestConfigurationWithMocks; import fi.vm.sade.sijoittelu.batch.logic.impl.DomainConverter; import fi.vm.sade.sijoittelu.batch.logic.impl.algorithm.PrintHelper; import fi.vm.sade.sijoittelu.batch.logic.impl.algorithm.SijoitteluConfiguration; @@ -21,19 +20,17 @@ import fi.vm.sade.valintalaskenta.tulos.service.impl.ValintatietoService; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; -import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.jdbc.Sql; -import org.springframework.test.context.junit.jupiter.SpringExtension; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; - +@ActiveProfiles("test") public class VastaanottoTest extends AbstractIntegrationTest { @Autowired From 3238a5dbe9775423d822c15c4c8ac8b193dc3c25 Mon Sep 17 00:00:00 2001 From: Santeri Korri Date: Fri, 17 May 2024 09:28:05 +0300 Subject: [PATCH 3/5] OK-493 Refaktorointia --- .../configuration/AccessLogConfiguration.java | 2 +- .../configuration/ExternalConfiguration.java | 2 +- .../configuration/FlywayConfiguration.java | 2 +- .../configuration/PropertyConfiguration.java | 2 +- .../configuration/SecurityConfiguration.java | 2 +- .../SijoitteluDatabaseConfiguration.java | 2 +- .../SijoitteluRouteConfig.java | 8 +- .../SijoitteluServiceConfiguration.java | 2 +- .../ValintalaskentaDatabaseConfiguration.java | 2 +- ...01__LueJatkuvatSijoittelutSeurannasta.java | 20 ++--- .../jatkuva/dao/JatkuvaSijoitteluDAO.java | 10 +-- .../jatkuva/dao/dto/SijoitteluDto.java | 81 ------------------- .../dao/impl/JatkuvaSijoitteluDAOImpl.java | 17 ++-- .../dto/AjastettuSijoitteluInfo.java | 2 +- .../jatkuva/dto/JatkuvaSijoittelu.java | 51 ++++++++++++ .../{sijoittelu => }/dto/Sijoittelu.java | 2 +- .../job/AjastettuSijoitteluJob.java | 2 +- .../jatkuva/parametrit/ParametritParser.java | 64 --------------- .../SijoitteluAktivointiResource.java | 31 ++++--- .../service/JatkuvaSijoitteluService.java | 12 +++ .../service/SijoittelunAktivointiService.java | 8 ++ .../service/SijoittelunValvontaService.java | 7 ++ .../impl/JatkuvaSijoitteluServiceImpl.java} | 41 +++++----- .../impl/SijoitteluRouteImpl.java | 10 +-- .../SijoittelultaEiSisaltoaPoikkeus.java | 9 --- .../komponentti/JatkuvaSijoittelu.java | 12 --- .../ModuloiPaivamaaraJaTunnit.java | 50 ------------ .../route/SijoitteluAktivointiRoute.java | 8 -- .../sijoittelu/route/SijoittelunValvonta.java | 7 -- .../external/resource/HttpClients.java | 2 +- .../resource/ErillisSijoitteluResource.java | 4 +- .../business/ToteutaSijoitteluService.java | 2 +- .../impl/TarjontaIntegrationServiceImpl.java | 3 +- 33 files changed, 160 insertions(+), 319 deletions(-) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/{laskenta => }/configuration/AccessLogConfiguration.java (96%) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/{laskenta => }/configuration/ExternalConfiguration.java (98%) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/{laskenta => }/configuration/FlywayConfiguration.java (96%) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/{laskenta => }/configuration/PropertyConfiguration.java (88%) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/{laskenta => }/configuration/SecurityConfiguration.java (99%) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/{laskenta => }/configuration/SijoitteluDatabaseConfiguration.java (96%) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/{jatkuva/sijoittelu/route/impl => configuration}/SijoitteluRouteConfig.java (85%) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/{laskenta => }/configuration/SijoitteluServiceConfiguration.java (97%) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/{laskenta => }/configuration/ValintalaskentaDatabaseConfiguration.java (99%) delete mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/dto/SijoitteluDto.java rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/{sijoittelu => }/dto/AjastettuSijoitteluInfo.java (91%) create mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dto/JatkuvaSijoittelu.java rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/{sijoittelu => }/dto/Sijoittelu.java (94%) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/{sijoittelu => }/job/AjastettuSijoitteluJob.java (97%) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/{sijoittelu => }/resource/SijoitteluAktivointiResource.java (90%) create mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/JatkuvaSijoitteluService.java create mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/SijoittelunAktivointiService.java create mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/SijoittelunValvontaService.java rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/{sijoittelu/route/impl/JatkuvaSijoitteluRouteImpl.java => service/impl/JatkuvaSijoitteluServiceImpl.java} (86%) rename sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/{sijoittelu/route => service}/impl/SijoitteluRouteImpl.java (87%) delete mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/exception/SijoittelultaEiSisaltoaPoikkeus.java delete mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/komponentti/JatkuvaSijoittelu.java delete mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/komponentti/ModuloiPaivamaaraJaTunnit.java delete mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/SijoitteluAktivointiRoute.java delete mode 100644 sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/SijoittelunValvonta.java diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/AccessLogConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/AccessLogConfiguration.java similarity index 96% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/AccessLogConfiguration.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/AccessLogConfiguration.java index a450ebd1f..6995d1b96 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/AccessLogConfiguration.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/AccessLogConfiguration.java @@ -1,4 +1,4 @@ -package fi.vm.sade.sijoittelu.laskenta.configuration; +package fi.vm.sade.sijoittelu.configuration; import ch.qos.logback.access.tomcat.LogbackValve; import org.springframework.beans.factory.annotation.Value; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/ExternalConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/ExternalConfiguration.java similarity index 98% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/ExternalConfiguration.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/ExternalConfiguration.java index 0a23691e8..2d4ad9821 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/ExternalConfiguration.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/ExternalConfiguration.java @@ -1,4 +1,4 @@ -package fi.vm.sade.sijoittelu.laskenta.configuration; +package fi.vm.sade.sijoittelu.configuration; import fi.vm.sade.sijoittelu.domain.Valintatulos; import fi.vm.sade.sijoittelu.domain.VastaanotettavuusDTO; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/FlywayConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/FlywayConfiguration.java similarity index 96% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/FlywayConfiguration.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/FlywayConfiguration.java index 739cfd58e..f59d27f36 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/FlywayConfiguration.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/FlywayConfiguration.java @@ -1,4 +1,4 @@ -package fi.vm.sade.sijoittelu.laskenta.configuration; +package fi.vm.sade.sijoittelu.configuration; import fi.vm.sade.sijoittelu.flyway.V20240419000001__LueJatkuvatSijoittelutSeurannasta; import fi.vm.sade.sijoittelu.jatkuva.external.resource.viestintapalvelu.RestCasClient; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/PropertyConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/PropertyConfiguration.java similarity index 88% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/PropertyConfiguration.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/PropertyConfiguration.java index 16d81a522..59f567c35 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/PropertyConfiguration.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/PropertyConfiguration.java @@ -1,4 +1,4 @@ -package fi.vm.sade.sijoittelu.laskenta.configuration; +package fi.vm.sade.sijoittelu.configuration; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SecurityConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SecurityConfiguration.java similarity index 99% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SecurityConfiguration.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SecurityConfiguration.java index 132dcca43..1f289fd90 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SecurityConfiguration.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SecurityConfiguration.java @@ -1,4 +1,4 @@ -package fi.vm.sade.sijoittelu.laskenta.configuration; +package fi.vm.sade.sijoittelu.configuration; import fi.vm.sade.java_utils.security.OpintopolkuCasAuthenticationFilter; import fi.vm.sade.javautils.kayttooikeusclient.OphUserDetailsServiceImpl; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluDatabaseConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SijoitteluDatabaseConfiguration.java similarity index 96% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluDatabaseConfiguration.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SijoitteluDatabaseConfiguration.java index cf109decf..0ee5a91f0 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluDatabaseConfiguration.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SijoitteluDatabaseConfiguration.java @@ -1,4 +1,4 @@ -package fi.vm.sade.sijoittelu.laskenta.configuration; +package fi.vm.sade.sijoittelu.configuration; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteConfig.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SijoitteluRouteConfig.java similarity index 85% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteConfig.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SijoitteluRouteConfig.java index 517778b97..98b1f6c9b 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteConfig.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SijoitteluRouteConfig.java @@ -1,7 +1,7 @@ -package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.route.impl; +package fi.vm.sade.sijoittelu.configuration; import fi.vm.sade.sijoittelu.jatkuva.dao.JatkuvaSijoitteluDAO; -import fi.vm.sade.sijoittelu.laskenta.configuration.FlywayConfiguration; +import fi.vm.sade.sijoittelu.jatkuva.service.impl.JatkuvaSijoitteluServiceImpl; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -13,7 +13,7 @@ public class SijoitteluRouteConfig { @Bean - public JatkuvaSijoitteluRouteImpl getJatkuvaSijoitteluRouteImpl( + public JatkuvaSijoitteluServiceImpl getJatkuvaSijoitteluRouteImpl( // riippuvuus Flyway-migraatioihin jotta tätä beania ei luoda ennen kuin jatkuvien sijoitteluiden migraatio // seurantapalvelusta ajettu. Tämän voin refaktoroida pois kun migraatio onnistuneesti suoritettu. FlywayConfiguration.FlywayMigrationDone flywayMigrationDone, @@ -22,7 +22,7 @@ public JatkuvaSijoitteluRouteImpl getJatkuvaSijoitteluRouteImpl( long jatkuvaSijoitteluPollIntervalInMinutes, JatkuvaSijoitteluDAO jatkuvaSijoitteluDAO, SchedulerFactoryBean schedulerFactoryBean) { - return new JatkuvaSijoitteluRouteImpl( + return new JatkuvaSijoitteluServiceImpl( autoStartup, jatkuvaSijoitteluPollIntervalInMinutes, jatkuvaSijoitteluDAO, diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluServiceConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SijoitteluServiceConfiguration.java similarity index 97% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluServiceConfiguration.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SijoitteluServiceConfiguration.java index 9d8133c08..be11e734a 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/SijoitteluServiceConfiguration.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/SijoitteluServiceConfiguration.java @@ -1,4 +1,4 @@ -package fi.vm.sade.sijoittelu.laskenta.configuration; +package fi.vm.sade.sijoittelu.configuration; import fi.vm.sade.auditlog.ApplicationType; import fi.vm.sade.auditlog.Audit; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/ValintalaskentaDatabaseConfiguration.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/ValintalaskentaDatabaseConfiguration.java similarity index 99% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/ValintalaskentaDatabaseConfiguration.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/ValintalaskentaDatabaseConfiguration.java index 499c941e8..3b4ee687a 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/configuration/ValintalaskentaDatabaseConfiguration.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/configuration/ValintalaskentaDatabaseConfiguration.java @@ -1,4 +1,4 @@ -package fi.vm.sade.sijoittelu.laskenta.configuration; +package fi.vm.sade.sijoittelu.configuration; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/flyway/V20240419000001__LueJatkuvatSijoittelutSeurannasta.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/flyway/V20240419000001__LueJatkuvatSijoittelutSeurannasta.java index 05f210284..3c8ff15c3 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/flyway/V20240419000001__LueJatkuvatSijoittelutSeurannasta.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/flyway/V20240419000001__LueJatkuvatSijoittelutSeurannasta.java @@ -1,7 +1,7 @@ package fi.vm.sade.sijoittelu.flyway; import com.google.gson.reflect.TypeToken; -import fi.vm.sade.sijoittelu.jatkuva.dao.dto.SijoitteluDto; +import fi.vm.sade.sijoittelu.jatkuva.dto.JatkuvaSijoittelu; import fi.vm.sade.sijoittelu.jatkuva.external.resource.viestintapalvelu.RestCasClient; import fi.vm.sade.sijoittelu.laskenta.util.UrlProperties; import org.flywaydb.core.api.migration.BaseJavaMigration; @@ -34,13 +34,13 @@ public static void setDependencies(UrlProperties properties, RestCasClient clien isTest = test; } - public Collection hae() { + public Collection hae() { try { return seurantaCasClient .get( urlProperties.url("valintalaskentakoostepalvelu.seuranta.rest.url") + "/sijoittelunseuranta/hae", - new TypeToken>() {}, + new TypeToken>() {}, Collections.emptyMap(), 10 * 60 * 1000) .get(); @@ -56,17 +56,17 @@ public void migrate(Context context) { } else { JdbcTemplate template = new JdbcTemplate(); template.setDataSource(new SingleConnectionDataSource(context.getConnection(), true)); - for(SijoitteluDto sijoitteluDto : this.hae()) { - if(OID_PATTERN.matcher(sijoitteluDto.getHakuOid()).matches()) { + for(JatkuvaSijoittelu jatkuvaSijoittelu : this.hae()) { + if(OID_PATTERN.matcher(jatkuvaSijoittelu.getHakuOid()).matches()) { template.update( "INSERT INTO jatkuvat " + "(haku_oid, jatkuva_paalla, viimeksi_ajettu, aloitus, ajotiheys) " + "VALUES (?, ?, ?::timestamptz, ?::timestamptz, ?)", - sijoitteluDto.getHakuOid(), - sijoitteluDto.isAjossa(), - sijoitteluDto.getViimeksiAjettu(), - sijoitteluDto.getAloitusajankohta(), - sijoitteluDto.getAjotiheys()); + jatkuvaSijoittelu.getHakuOid(), + jatkuvaSijoittelu.isAjossa(), + jatkuvaSijoittelu.getViimeksiAjettu(), + jatkuvaSijoittelu.getAloitusajankohta(), + jatkuvaSijoittelu.getAjotiheys()); } } } diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/JatkuvaSijoitteluDAO.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/JatkuvaSijoitteluDAO.java index fd01a8f56..0215e67e6 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/JatkuvaSijoitteluDAO.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/JatkuvaSijoitteluDAO.java @@ -1,17 +1,17 @@ package fi.vm.sade.sijoittelu.jatkuva.dao; -import fi.vm.sade.sijoittelu.jatkuva.dao.dto.SijoitteluDto; +import fi.vm.sade.sijoittelu.jatkuva.dto.JatkuvaSijoittelu; import java.util.Collection; public interface JatkuvaSijoitteluDAO { - SijoitteluDto hae(String hakuOid); + JatkuvaSijoittelu hae(String hakuOid); - Collection hae(); + Collection hae(); - SijoitteluDto merkkaaSijoittelunAjossaTila(String hakuOid, boolean tila); + JatkuvaSijoittelu merkkaaSijoittelunAjossaTila(String hakuOid, boolean tila); - SijoitteluDto merkkaaSijoittelunAjetuksi(String hakuOid); + JatkuvaSijoittelu merkkaaSijoittelunAjetuksi(String hakuOid); void poistaSijoittelu(String hakuOid); diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/dto/SijoitteluDto.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/dto/SijoitteluDto.java deleted file mode 100644 index ca41e279c..000000000 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/dto/SijoitteluDto.java +++ /dev/null @@ -1,81 +0,0 @@ -package fi.vm.sade.sijoittelu.jatkuva.dao.dto; - -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.DateTimeFormatter; - -import java.util.Date; - -public class SijoitteluDto { - private static final DateTimeFormatter PVMFORMATTER = DateTimeFormat.forPattern("dd.MM.yyyy HH:mm"); - - private final String hakuOid; - private final boolean ajossa; - private final Date viimeksiAjettu; - private final String virhe; - private Date aloitusajankohta; - private Integer ajotiheys; - - public SijoitteluDto() { - this.hakuOid = null; - this.ajossa = false; - this.viimeksiAjettu = null; - this.virhe = null; - this.aloitusajankohta = null; - this.ajotiheys = null; - } - - public SijoitteluDto(String hakuOid, boolean ajossa, Date viimeksiAjettu, String virhe, Date aloitusajankohta, Integer ajotiheys) { - this.hakuOid = hakuOid; - this.ajossa = ajossa; - this.viimeksiAjettu = viimeksiAjettu; - this.virhe = virhe; - this.aloitusajankohta = aloitusajankohta; - this.ajotiheys = ajotiheys; - } - - public String getViimeksiAjettuFormatoituna() { - if (viimeksiAjettu == null) { - return null; - } - return PVMFORMATTER.print(viimeksiAjettu.getTime()); - } - - public String getAloitusajankohtaFormatoituna() { - if (aloitusajankohta == null) { - return null; - } - return PVMFORMATTER.print(aloitusajankohta.getTime()); - } - - public String getVirhe() { - return virhe; - } - - public String getHakuOid() { - return hakuOid; - } - - public Date getViimeksiAjettu() { - return viimeksiAjettu; - } - - public boolean isAjossa() { - return ajossa; - } - - public Date getAloitusajankohta() { - return aloitusajankohta; - } - - public void setAloitusajankohta(Date aloitusajankohta) { - this.aloitusajankohta = aloitusajankohta; - } - - public Integer getAjotiheys() { - return ajotiheys; - } - - public void setAjotiheys(Integer ajotiheys) { - this.ajotiheys = ajotiheys; - } -} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/impl/JatkuvaSijoitteluDAOImpl.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/impl/JatkuvaSijoitteluDAOImpl.java index 231830041..91cef9656 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/impl/JatkuvaSijoitteluDAOImpl.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dao/impl/JatkuvaSijoitteluDAOImpl.java @@ -5,24 +5,21 @@ import java.time.Instant; import java.util.*; -import fi.vm.sade.sijoittelu.jatkuva.dao.dto.SijoitteluDto; +import fi.vm.sade.sijoittelu.jatkuva.dto.JatkuvaSijoittelu; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Profile; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Service; -// TODO: clean up implementation @Service -@Profile({"default", "dev"}) public class JatkuvaSijoitteluDAOImpl implements JatkuvaSijoitteluDAO { private final JdbcTemplate jdbcTemplate; - private final RowMapper sijoitteluDtoRowMapper = (rs, rowNum) -> - new SijoitteluDto( + private final RowMapper sijoitteluDtoRowMapper = (rs, rowNum) -> + new JatkuvaSijoittelu( rs.getString("haku_oid"), rs.getBoolean("jatkuva_paalla"), rs.getTimestamp("viimeksi_ajettu"), @@ -37,7 +34,7 @@ public JatkuvaSijoitteluDAOImpl(@Qualifier("sijoitteluJdbcTemplate") JdbcTemplat } @Override - public SijoitteluDto hae(String hakuOid) { + public JatkuvaSijoittelu hae(String hakuOid) { try { return jdbcTemplate.queryForObject("SELECT haku_oid, jatkuva_paalla, viimeksi_ajettu, aloitus, ajotiheys FROM jatkuvat WHERE haku_oid=?", sijoitteluDtoRowMapper, hakuOid); @@ -49,7 +46,7 @@ public SijoitteluDto hae(String hakuOid) { } @Override - public Collection hae() { + public Collection hae() { try { return jdbcTemplate.query("SELECT haku_oid, jatkuva_paalla, viimeksi_ajettu, aloitus, ajotiheys FROM jatkuvat", sijoitteluDtoRowMapper); } catch (Exception e) { @@ -58,7 +55,7 @@ public Collection hae() { } @Override - public SijoitteluDto merkkaaSijoittelunAjossaTila(String hakuOid, boolean tila) { + public JatkuvaSijoittelu merkkaaSijoittelunAjossaTila(String hakuOid, boolean tila) { try { this.jdbcTemplate.update( "INSERT INTO jatkuvat " + @@ -73,7 +70,7 @@ public SijoitteluDto merkkaaSijoittelunAjossaTila(String hakuOid, boolean tila) } @Override - public SijoitteluDto merkkaaSijoittelunAjetuksi(String hakuOid) { + public JatkuvaSijoittelu merkkaaSijoittelunAjetuksi(String hakuOid) { try { String now = new Date().toString(); this.jdbcTemplate.update("INSERT INTO jatkuvat " + diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/dto/AjastettuSijoitteluInfo.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dto/AjastettuSijoitteluInfo.java similarity index 91% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/dto/AjastettuSijoitteluInfo.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dto/AjastettuSijoitteluInfo.java index 886239813..7866c85de 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/dto/AjastettuSijoitteluInfo.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dto/AjastettuSijoitteluInfo.java @@ -1,4 +1,4 @@ -package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.dto; +package fi.vm.sade.sijoittelu.jatkuva.dto; import fi.vm.sade.sijoittelu.jatkuva.util.Formatter; import java.util.Date; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dto/JatkuvaSijoittelu.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dto/JatkuvaSijoittelu.java new file mode 100644 index 000000000..44623af67 --- /dev/null +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dto/JatkuvaSijoittelu.java @@ -0,0 +1,51 @@ +package fi.vm.sade.sijoittelu.jatkuva.dto; + +import java.util.Date; + +public class JatkuvaSijoittelu { + + private final String hakuOid; + private final boolean ajossa; + private final Date viimeksiAjettu; + private final String virhe; + private Date aloitusajankohta; + private Integer ajotiheys; + + public JatkuvaSijoittelu() { + this.hakuOid = null; + this.ajossa = false; + this.viimeksiAjettu = null; + this.virhe = null; + this.aloitusajankohta = null; + this.ajotiheys = null; + } + + public JatkuvaSijoittelu(String hakuOid, boolean ajossa, Date viimeksiAjettu, String virhe, Date aloitusajankohta, Integer ajotiheys) { + this.hakuOid = hakuOid; + this.ajossa = ajossa; + this.viimeksiAjettu = viimeksiAjettu; + this.virhe = virhe; + this.aloitusajankohta = aloitusajankohta; + this.ajotiheys = ajotiheys; + } + + public String getVirhe() { return virhe; } + + public String getHakuOid() { + return hakuOid; + } + + public Date getViimeksiAjettu() { + return viimeksiAjettu; + } + + public boolean isAjossa() { + return ajossa; + } + + public Date getAloitusajankohta() { return aloitusajankohta; } + + public Integer getAjotiheys() { + return ajotiheys; + } +} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/dto/Sijoittelu.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dto/Sijoittelu.java similarity index 94% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/dto/Sijoittelu.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dto/Sijoittelu.java index 5b11b4d3f..b380da809 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/dto/Sijoittelu.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/dto/Sijoittelu.java @@ -1,4 +1,4 @@ -package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.dto; +package fi.vm.sade.sijoittelu.jatkuva.dto; import java.util.concurrent.atomic.AtomicInteger; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/job/AjastettuSijoitteluJob.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/job/AjastettuSijoitteluJob.java similarity index 97% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/job/AjastettuSijoitteluJob.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/job/AjastettuSijoitteluJob.java index 6ee431ab8..a41d7ace3 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/job/AjastettuSijoitteluJob.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/job/AjastettuSijoitteluJob.java @@ -1,4 +1,4 @@ -package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.job; +package fi.vm.sade.sijoittelu.jatkuva.job; import fi.vm.sade.sijoittelu.jatkuva.dao.JatkuvaSijoitteluDAO; import fi.vm.sade.sijoittelu.laskenta.service.business.ToteutaSijoitteluService; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/parametrit/ParametritParser.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/parametrit/ParametritParser.java index 837735fbb..1c8b0bf05 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/parametrit/ParametritParser.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/parametrit/ParametritParser.java @@ -4,16 +4,12 @@ import fi.vm.sade.sijoittelu.jatkuva.external.resource.ohjausparametrit.dto.ParametritDTO; import java.util.Calendar; import java.util.Date; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; public class ParametritParser { - private static final Logger LOG = LoggerFactory.getLogger(ParametritParser.class); - private ParametritDTO parametrit; private String rootOrganisaatioOid; @@ -22,45 +18,6 @@ public ParametritParser(ParametritDTO parametrit, String rootOrganisaatioOid) { this.rootOrganisaatioOid = rootOrganisaatioOid; } - public boolean pistesyottoEnabled() { - if (isOPH()) { - return true; - } - return valintapalvelunKayttoEnabled(); - } - - public boolean hakeneetEnabled() { - if (isOPH()) { - return true; - } - return valintapalvelunKayttoEnabled(); - } - - public boolean harkinnanvaraisetEnabled() { - if (isOPH()) { - return true; - } - return valintapalvelunKayttoEnabled(); - } - - public boolean valintakoekutsutEnabled() { - if (isOPH()) { - return true; - } - return valintapalvelunKayttoEnabled(); - } - - public boolean valintalaskentaEnabled() { - return valintapalvelunKayttoEnabled(); - } - - public boolean hakijaryhmatEnabled() { - if (isOPH()) { - return true; - } - return valintapalvelunKayttoEnabled(); - } - public boolean valinnanhallintaEnabled() { if (isOPH()) { return true; @@ -99,22 +56,6 @@ public boolean koetulostenTallentaminenEnabled() { return isAllowedBetween(this.parametrit.getPH_KTT()); } - public boolean koekutsujenMuodostaminenEnabled() { - return isAllowedBetween(this.parametrit.getPH_KKM()); - } - - public boolean harkinnanvarainenPaatosTallennusEnabled() { - if (isOPH()) { - return true; - } - ParametriDTO param = this.parametrit.getPH_HVVPTP(); - Date now = Calendar.getInstance().getTime(); - if (param == null || param.getDate() == null || now.before(param.getDate())) { - return true; - } - return false; - } - private boolean isAllowedBetween(ParametriDTO param) { if (isOPH()) { return true; @@ -128,11 +69,6 @@ private boolean isAllowedBetween(ParametriDTO param) { return true; } - public Date opiskelijanPaikanVastaanottoPaattyy() { - if (this.parametrit.getPH_OPVP() == null) return null; - return this.parametrit.getPH_OPVP().getDate(); - } - private boolean isOPH() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); for (GrantedAuthority authority : authentication.getAuthorities()) { diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/resource/SijoitteluAktivointiResource.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/resource/SijoitteluAktivointiResource.java similarity index 90% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/resource/SijoitteluAktivointiResource.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/resource/SijoitteluAktivointiResource.java index 067db785e..8fb3230a9 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/resource/SijoitteluAktivointiResource.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/resource/SijoitteluAktivointiResource.java @@ -1,19 +1,19 @@ -package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.resource; +package fi.vm.sade.sijoittelu.jatkuva.resource; import com.google.gson.Gson; import fi.vm.sade.auditlog.Audit; import fi.vm.sade.auditlog.Changes; import fi.vm.sade.sijoittelu.jatkuva.dao.JatkuvaSijoitteluDAO; -import fi.vm.sade.sijoittelu.jatkuva.dao.dto.SijoitteluDto; +import fi.vm.sade.sijoittelu.jatkuva.dto.JatkuvaSijoittelu; import fi.vm.sade.sijoittelu.jatkuva.external.resource.tarjonta.TarjontaAsyncResource; -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.dto.AjastettuSijoitteluInfo; -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.dto.Sijoittelu; +import fi.vm.sade.sijoittelu.jatkuva.dto.AjastettuSijoitteluInfo; +import fi.vm.sade.sijoittelu.jatkuva.dto.Sijoittelu; +import fi.vm.sade.sijoittelu.jatkuva.service.JatkuvaSijoitteluService; import fi.vm.sade.sijoittelu.jatkuva.util.SecurityUtil; import fi.vm.sade.sijoittelu.jatkuva.parametrit.service.HakuParametritService; import fi.vm.sade.sijoittelu.jatkuva.security.AuthorityCheckService; -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.komponentti.JatkuvaSijoittelu; -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.route.SijoitteluAktivointiRoute; -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.route.SijoittelunValvonta; +import fi.vm.sade.sijoittelu.jatkuva.service.SijoittelunAktivointiService; +import fi.vm.sade.sijoittelu.jatkuva.service.SijoittelunValvontaService; import fi.vm.sade.valinta.sharedutils.AuditLog; import fi.vm.sade.valinta.sharedutils.ValintaResource; import fi.vm.sade.valinta.sharedutils.ValintaperusteetOperation; @@ -40,7 +40,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; -/** @Autowired(required = false) Camel-reitit valinnaisiksi poisrefaktorointia odotellessa. */ @RestController("SijoitteluAktivointiResource") @RequestMapping("/resources/koostesijoittelu") @PreAuthorize("isAuthenticated()") @@ -55,16 +54,16 @@ public class SijoitteluAktivointiResource { public static final String ANY_CRUD = "hasAnyRole('ROLE_APP_SIJOITTELU_CRUD')"; public static final String OPH_CRUD_ROLE = "ROLE_APP_SIJOITTELU_CRUD_1.2.246.562.10.00000000001"; - @Autowired private SijoitteluAktivointiRoute sijoitteluAktivointiProxy; + @Autowired private SijoittelunAktivointiService sijoitteluAktivointiProxy; @Autowired(required = false) - private JatkuvaSijoittelu jatkuvaSijoittelu; + private JatkuvaSijoitteluService jatkuvaSijoittelu; @Autowired private HakuParametritService hakuParametritService; @Autowired private JatkuvaSijoitteluDAO sijoittelunSeurantaResource; - @Autowired private SijoittelunValvonta sijoittelunValvonta; + @Autowired private SijoittelunValvontaService sijoittelunValvonta; @Autowired private TarjontaAsyncResource tarjontaResource; @@ -149,8 +148,8 @@ public String aktivoiJatkuvassaSijoittelussa( if (StringUtils.isBlank(hakuOid)) { return "get parameter 'hakuOid' required"; } else { - SijoitteluDto sijoitteluDto = sijoittelunSeurantaResource.hae(hakuOid); - if (sijoitteluDto.getAloitusajankohta() == null || sijoitteluDto.getAjotiheys() == null) { + JatkuvaSijoittelu jatkuvaSijoittelu = sijoittelunSeurantaResource.hae(hakuOid); + if (jatkuvaSijoittelu.getAloitusajankohta() == null || jatkuvaSijoittelu.getAjotiheys() == null) { LOG.warn( "Haulta {} puuttuu jatkuvan sijoittelun parametreja. Ei aktivoida jatkuvaa sijoittelua."); return "ei aktivoitu"; @@ -201,7 +200,7 @@ public String poistaJatkuvastaSijoittelusta( responseCode = "OK", content = @Content(schema = @Schema(implementation = List.class))) }) - public Collection aktiivisetSijoittelut() { + public Collection aktiivisetSijoittelut() { return sijoittelunSeurantaResource.hae(); } @@ -269,8 +268,8 @@ private String jatkuvaTilaAutorisoituOrganisaatiolle(String hakuOid) { if (StringUtils.isBlank(hakuOid)) { return null; } else { - SijoitteluDto sijoitteluDto = sijoittelunSeurantaResource.hae(hakuOid); - return new Gson().toJson(sijoitteluDto); + JatkuvaSijoittelu jatkuvaSijoittelu = sijoittelunSeurantaResource.hae(hakuOid); + return new Gson().toJson(jatkuvaSijoittelu); } } diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/JatkuvaSijoitteluService.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/JatkuvaSijoitteluService.java new file mode 100644 index 000000000..22da11d51 --- /dev/null +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/JatkuvaSijoitteluService.java @@ -0,0 +1,12 @@ +package fi.vm.sade.sijoittelu.jatkuva.service; + +import fi.vm.sade.sijoittelu.jatkuva.dto.AjastettuSijoitteluInfo; + +import java.util.List; + +public interface JatkuvaSijoitteluService { + + List haeAjossaOlevatAjastetutSijoittelut(); + + void teeJatkuvaSijoittelu(); +} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/SijoittelunAktivointiService.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/SijoittelunAktivointiService.java new file mode 100644 index 000000000..64b6c7e6e --- /dev/null +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/SijoittelunAktivointiService.java @@ -0,0 +1,8 @@ +package fi.vm.sade.sijoittelu.jatkuva.service; + +import fi.vm.sade.sijoittelu.jatkuva.dto.Sijoittelu; + +public interface SijoittelunAktivointiService { + + void aktivoiSijoittelu(Sijoittelu sijoittelu); +} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/SijoittelunValvontaService.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/SijoittelunValvontaService.java new file mode 100644 index 000000000..2d1bd29fd --- /dev/null +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/SijoittelunValvontaService.java @@ -0,0 +1,7 @@ +package fi.vm.sade.sijoittelu.jatkuva.service; + +import fi.vm.sade.sijoittelu.jatkuva.dto.Sijoittelu; + +public interface SijoittelunValvontaService { + Sijoittelu haeAktiivinenSijoitteluHaulle(String hakuOid); +} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/JatkuvaSijoitteluRouteImpl.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/JatkuvaSijoitteluServiceImpl.java similarity index 86% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/JatkuvaSijoitteluRouteImpl.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/JatkuvaSijoitteluServiceImpl.java index 4a8d74590..5434f44ab 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/JatkuvaSijoitteluRouteImpl.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/JatkuvaSijoitteluServiceImpl.java @@ -1,11 +1,12 @@ -package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.route.impl; +package fi.vm.sade.sijoittelu.jatkuva.service.impl; import fi.vm.sade.sijoittelu.jatkuva.dao.JatkuvaSijoitteluDAO; -import fi.vm.sade.sijoittelu.jatkuva.dao.dto.SijoitteluDto; -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.dto.AjastettuSijoitteluInfo; +import fi.vm.sade.sijoittelu.jatkuva.dto.JatkuvaSijoittelu; +import fi.vm.sade.sijoittelu.jatkuva.dto.AjastettuSijoitteluInfo; +import fi.vm.sade.sijoittelu.jatkuva.service.JatkuvaSijoitteluService; import fi.vm.sade.sijoittelu.jatkuva.util.Formatter; -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.job.AjastettuSijoitteluJob; -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.komponentti.JatkuvaSijoittelu; +import fi.vm.sade.sijoittelu.jatkuva.job.AjastettuSijoitteluJob; + import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.Function; @@ -21,8 +22,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.quartz.SchedulerFactoryBean; -public class JatkuvaSijoitteluRouteImpl implements JatkuvaSijoittelu { - private static final Logger LOG = LoggerFactory.getLogger(JatkuvaSijoitteluRouteImpl.class); +public class JatkuvaSijoitteluServiceImpl implements JatkuvaSijoitteluService { + private static final Logger LOG = LoggerFactory.getLogger(JatkuvaSijoitteluServiceImpl.class); private final JatkuvaSijoitteluDAO sijoittelunSeurantaResource; private final int VAKIO_AJOTIHEYS = 24; @@ -38,7 +39,7 @@ private Timer createAjastettujenSijoitteluidenPaivittaja(boolean start, long run new TimerTask() { public void run() { try { - JatkuvaSijoitteluRouteImpl.this.teeJatkuvaSijoittelu(); + JatkuvaSijoitteluServiceImpl.this.teeJatkuvaSijoittelu(); } catch (Exception e) { LOG.error("Exception in JatkuvaSijoitteluTimerTask", e); } @@ -52,7 +53,7 @@ public void run() { } @Autowired - public JatkuvaSijoitteluRouteImpl( + public JatkuvaSijoitteluServiceImpl( @Value("${jatkuvasijoittelu.autostart:true}") boolean autoStartup, @Value("${valintalaskentakoostepalvelu.jatkuvasijoittelu.intervalMinutes:5}") long jatkuvaSijoitteluPollIntervalInMinutes, @@ -73,7 +74,7 @@ public JatkuvaSijoitteluRouteImpl( @Override public void teeJatkuvaSijoittelu() { LOG.info("Sijoitteluiden ajastin kaynnistyi"); - Map aktiivisetSijoittelut = getAktiivisetSijoittelut(); + Map aktiivisetSijoittelut = getAktiivisetSijoittelut(); LOG.info( "Sijoitteluiden ajastin sai seurannalta {} aktiivista sijoittelua.", aktiivisetSijoittelut.size()); @@ -99,7 +100,7 @@ public List haeAjossaOlevatAjastetutSijoittelut() { } } - private void laitaAjoon(Map aktiivisetSijoittelut) { + private void laitaAjoon(Map aktiivisetSijoittelut) { aktiivisetSijoittelut.forEach( (hakuOid, sijoitteluDto) -> { if (sijoitteluDto.getAloitusajankohta() == null || sijoitteluDto.getAjotiheys() == null) { @@ -177,7 +178,7 @@ private void laitaAjoon(Map aktiivisetSijoittelut) { }); } - private void poistaSammutetut(Map aktiivisetSijoittelut) { + private void poistaSammutetut(Map aktiivisetSijoittelut) { try { sijoitteluScheduler .getJobGroupNames() @@ -201,7 +202,7 @@ private void poistaSammutetut(Map aktiivisetSijoittelut) } } - private Map getAktiivisetSijoittelut() { + private Map getAktiivisetSijoittelut() { try { return _getAktiivisetSijoittelut(); } catch (NotAuthorizedException e) { @@ -210,28 +211,28 @@ private Map getAktiivisetSijoittelut() { } } - private Map _getAktiivisetSijoittelut() { + private Map _getAktiivisetSijoittelut() { return sijoittelunSeurantaResource.hae().stream() .filter(Objects::nonNull) - .filter(SijoitteluDto::isAjossa) + .filter(JatkuvaSijoittelu::isAjossa) .filter( sijoitteluDto -> { DateTime aloitusajankohta = getAloitusajankohta(sijoitteluDto); return aktivoidaanko(aloitusajankohta); }) - .collect(Collectors.toMap(SijoitteluDto::getHakuOid, s -> s)); + .collect(Collectors.toMap(JatkuvaSijoittelu::getHakuOid, s -> s)); } - public int getAjotiheys(SijoitteluDto sijoitteluDto) { - return Optional.ofNullable(sijoitteluDto.getAjotiheys()).orElse(VAKIO_AJOTIHEYS); + public int getAjotiheys(JatkuvaSijoittelu jatkuvaSijoittelu) { + return Optional.ofNullable(jatkuvaSijoittelu.getAjotiheys()).orElse(VAKIO_AJOTIHEYS); } public boolean aktivoidaanko(DateTime aloitusAika) { return aloitusAika.isBefore(DateTime.now().plusHours(1)); } - private DateTime getAloitusajankohta(SijoitteluDto sijoitteluDto) { + private DateTime getAloitusajankohta(JatkuvaSijoittelu jatkuvaSijoittelu) { return new DateTime( - Optional.ofNullable(sijoitteluDto.getAloitusajankohta()).orElse(new Date())); + Optional.ofNullable(jatkuvaSijoittelu.getAloitusajankohta()).orElse(new Date())); } } diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteImpl.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/SijoitteluRouteImpl.java similarity index 87% rename from sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteImpl.java rename to sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/SijoitteluRouteImpl.java index 17738d087..83cb64e1c 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/impl/SijoitteluRouteImpl.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/SijoitteluRouteImpl.java @@ -1,12 +1,12 @@ -package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.route.impl; +package fi.vm.sade.sijoittelu.jatkuva.service.impl; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.RemovalListener; -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.dto.Sijoittelu; +import fi.vm.sade.sijoittelu.jatkuva.dto.Sijoittelu; import fi.vm.sade.sijoittelu.laskenta.service.business.ToteutaSijoitteluService; -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.route.SijoitteluAktivointiRoute; -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.route.SijoittelunValvonta; +import fi.vm.sade.sijoittelu.jatkuva.service.SijoittelunAktivointiService; +import fi.vm.sade.sijoittelu.jatkuva.service.SijoittelunValvontaService; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +14,7 @@ import org.springframework.stereotype.Component; @Component -public class SijoitteluRouteImpl implements SijoittelunValvonta, SijoitteluAktivointiRoute { +public class SijoitteluRouteImpl implements SijoittelunValvontaService, SijoittelunAktivointiService { private static final Logger LOG = LoggerFactory.getLogger(SijoitteluRouteImpl.class); private final ToteutaSijoitteluService toteutaSijoitteluService; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/exception/SijoittelultaEiSisaltoaPoikkeus.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/exception/SijoittelultaEiSisaltoaPoikkeus.java deleted file mode 100644 index 7667d7770..000000000 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/exception/SijoittelultaEiSisaltoaPoikkeus.java +++ /dev/null @@ -1,9 +0,0 @@ -package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.exception; - -public class SijoittelultaEiSisaltoaPoikkeus extends RuntimeException { - private static final long serialVersionUID = 1L; - - public SijoittelultaEiSisaltoaPoikkeus(String viesti) { - super(viesti); - } -} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/komponentti/JatkuvaSijoittelu.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/komponentti/JatkuvaSijoittelu.java deleted file mode 100644 index 432d591e1..000000000 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/komponentti/JatkuvaSijoittelu.java +++ /dev/null @@ -1,12 +0,0 @@ -package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.komponentti; - -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.dto.AjastettuSijoitteluInfo; - -import java.util.List; - -public interface JatkuvaSijoittelu { - - List haeAjossaOlevatAjastetutSijoittelut(); - - void teeJatkuvaSijoittelu(); -} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/komponentti/ModuloiPaivamaaraJaTunnit.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/komponentti/ModuloiPaivamaaraJaTunnit.java deleted file mode 100644 index 5899865ac..000000000 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/komponentti/ModuloiPaivamaaraJaTunnit.java +++ /dev/null @@ -1,50 +0,0 @@ -package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.komponentti; - -import fi.vm.sade.sijoittelu.jatkuva.util.Formatter; -import org.joda.time.DateTime; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ModuloiPaivamaaraJaTunnit { - private static final Logger LOG = LoggerFactory.getLogger(ModuloiPaivamaaraJaTunnit.class); - - public static DateTime moduloiSeuraava(DateTime start, DateTime now, int moduloitavaTuntiMaara) { - // if (now.isBefore(start)) - if (now.isBefore(start.minusHours(1))) { - LOG.error( - "Yritettiin moduloida seuraavaa suoritusaikaa vaikka aloitusaika ei ole viela tapahtunut! Aloituspvm {} mutta nyt on {}", - Formatter.paivamaara(start.toDate()), - Formatter.paivamaara(now.toDate())); - throw new RuntimeException( - "Yritettiin moduloida seuraavaa suoritusaikaa vaikka aloitusaika ei ole viela tapahtunut!"); - } - int tavoiteTunti = - seuraavaAskel(start.getHourOfDay(), now.getHourOfDay(), moduloitavaTuntiMaara); - if (now.getHourOfDay() == tavoiteTunti && now.getMinuteOfHour() > start.getMinuteOfHour()) { - tavoiteTunti += moduloitavaTuntiMaara; - } - return new DateTime( - now.getYear(), - now.getMonthOfYear(), - now.getDayOfMonth(), - start.getHourOfDay(), - start.getMinuteOfHour()) - .plusHours(tavoiteTunti - start.getHourOfDay()); - } - - public static int seuraavaAskel(int alkuPiste, int tavoiteAlue, int askel) { - if (alkuPiste <= tavoiteAlue) { - int i = alkuPiste; - while (i < tavoiteAlue) { - i += askel; - } - return i; - } else { - int i = alkuPiste; - while (i >= tavoiteAlue) { - i -= askel; - } - return i + askel; - } - } -} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/SijoitteluAktivointiRoute.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/SijoitteluAktivointiRoute.java deleted file mode 100644 index 400a88a68..000000000 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/SijoitteluAktivointiRoute.java +++ /dev/null @@ -1,8 +0,0 @@ -package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.route; - -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.dto.Sijoittelu; - -public interface SijoitteluAktivointiRoute { - - void aktivoiSijoittelu(Sijoittelu sijoittelu); -} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/SijoittelunValvonta.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/SijoittelunValvonta.java deleted file mode 100644 index 6c9dadb6c..000000000 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/sijoittelu/route/SijoittelunValvonta.java +++ /dev/null @@ -1,7 +0,0 @@ -package fi.vm.sade.sijoittelu.jatkuva.sijoittelu.route; - -import fi.vm.sade.sijoittelu.jatkuva.sijoittelu.dto.Sijoittelu; - -public interface SijoittelunValvonta { - Sijoittelu haeAktiivinenSijoitteluHaulle(String hakuOid); -} diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/external/resource/HttpClients.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/external/resource/HttpClients.java index 90ad0f4c5..87ddb53ce 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/external/resource/HttpClients.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/external/resource/HttpClients.java @@ -9,7 +9,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import static fi.vm.sade.sijoittelu.laskenta.configuration.SijoitteluServiceConfiguration.CALLER_ID; +import static fi.vm.sade.sijoittelu.configuration.SijoitteluServiceConfiguration.CALLER_ID; import static fi.vm.sade.valinta.sharedutils.http.HttpResource.CSRF_VALUE; @Configuration diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/resource/ErillisSijoitteluResource.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/resource/ErillisSijoitteluResource.java index d49d17948..4102d6aa3 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/resource/ErillisSijoitteluResource.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/resource/ErillisSijoitteluResource.java @@ -7,8 +7,7 @@ import com.google.gson.JsonSyntaxException; import fi.vm.sade.javautils.nio.cas.CasClient; import fi.vm.sade.service.valintaperusteet.dto.ValintatapajonoDTO; -import fi.vm.sade.sijoittelu.laskenta.configuration.SijoitteluServiceConfiguration; -import fi.vm.sade.sijoittelu.laskenta.external.resource.HttpClients; +import fi.vm.sade.sijoittelu.configuration.SijoitteluServiceConfiguration; import fi.vm.sade.sijoittelu.laskenta.service.business.SijoitteluBusinessService; import fi.vm.sade.sijoittelu.laskenta.util.UrlProperties; import fi.vm.sade.sijoittelu.tulos.dto.ValisijoitteluDTO; @@ -31,7 +30,6 @@ import org.springframework.web.bind.annotation.*; import java.util.*; -import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/business/ToteutaSijoitteluService.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/business/ToteutaSijoitteluService.java index 5eeec9590..579aee608 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/business/ToteutaSijoitteluService.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/business/ToteutaSijoitteluService.java @@ -13,7 +13,7 @@ import fi.vm.sade.service.valintaperusteet.dto.ValintatapajonoCreateDTO; import fi.vm.sade.service.valintaperusteet.dto.ValintatapajonoDTO; import fi.vm.sade.sijoittelu.domain.SijoitteluajonTila; -import fi.vm.sade.sijoittelu.laskenta.configuration.SijoitteluServiceConfiguration; +import fi.vm.sade.sijoittelu.configuration.SijoitteluServiceConfiguration; import fi.vm.sade.sijoittelu.laskenta.email.EmailService; import fi.vm.sade.sijoittelu.laskenta.service.it.Haku; import fi.vm.sade.sijoittelu.laskenta.service.it.TarjontaIntegrationService; diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/it/impl/TarjontaIntegrationServiceImpl.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/it/impl/TarjontaIntegrationServiceImpl.java index 02f8f90e1..eb7011f7f 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/it/impl/TarjontaIntegrationServiceImpl.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/laskenta/service/it/impl/TarjontaIntegrationServiceImpl.java @@ -3,9 +3,8 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import fi.vm.sade.javautils.nio.cas.CasClient; -import fi.vm.sade.sijoittelu.laskenta.configuration.SijoitteluServiceConfiguration; +import fi.vm.sade.sijoittelu.configuration.SijoitteluServiceConfiguration; import fi.vm.sade.sijoittelu.laskenta.external.resource.HakuV1Resource; -import fi.vm.sade.sijoittelu.laskenta.external.resource.HttpClients; import fi.vm.sade.sijoittelu.laskenta.external.resource.OhjausparametriResource; import fi.vm.sade.sijoittelu.laskenta.external.resource.dto.KoutaHaku; import fi.vm.sade.sijoittelu.laskenta.external.resource.dto.ParametriDTO; From e0e702631ff74743c3a87cd6877a8f7836056174 Mon Sep 17 00:00:00 2001 From: Santeri Korri Date: Fri, 17 May 2024 13:40:39 +0300 Subject: [PATCH 4/5] =?UTF-8?q?OK-493=20Laitetaan=20cron-jobin=20startAt?= =?UTF-8?q?=20tasan=20minuuttiin=20jotta=20ensimm=C3=A4inenkin=20ajastus?= =?UTF-8?q?=20ajetaan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jatkuva/service/impl/JatkuvaSijoitteluServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/JatkuvaSijoitteluServiceImpl.java b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/JatkuvaSijoitteluServiceImpl.java index 5434f44ab..157c4f5cb 100644 --- a/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/JatkuvaSijoitteluServiceImpl.java +++ b/sijoittelu-service/src/main/java/fi/vm/sade/sijoittelu/jatkuva/service/impl/JatkuvaSijoitteluServiceImpl.java @@ -114,7 +114,9 @@ private void laitaAjoon(Map aktiivisetSijoittelut) { sijoitteluDto.getAjotiheys()); } else { try { - Date asetusAjankohta = getAloitusajankohta(sijoitteluDto).toDate(); + // Käytetään minuutin tarkkuutta aloitusajankohdassa jotta ensimmäinen cron ei aikaisemmin + // kuin startAt + Date asetusAjankohta = getAloitusajankohta(sijoitteluDto).withSecondOfMinute(0).toDate(); Integer intervalli = getAjotiheys(sijoitteluDto); String jobName = From 48d8e3ee31175f9f72aab4e74f91b2a8ccf9d8bc Mon Sep 17 00:00:00 2001 From: Santeri Korri Date: Sat, 18 May 2024 10:39:21 +0300 Subject: [PATCH 5/5] =?UTF-8?q?OK-493=20Lis=C3=A4tty=20dao-testi=20jatkuva?= =?UTF-8?q?an=20sijoitteluun?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SijoitteluAktivointiResourceTest.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/jatkuva/resource/SijoitteluAktivointiResourceTest.java diff --git a/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/jatkuva/resource/SijoitteluAktivointiResourceTest.java b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/jatkuva/resource/SijoitteluAktivointiResourceTest.java new file mode 100644 index 000000000..ea4349bda --- /dev/null +++ b/sijoittelu-service/src/test/java/fi/vm/sade/sijoittelu/jatkuva/resource/SijoitteluAktivointiResourceTest.java @@ -0,0 +1,61 @@ +package fi.vm.sade.sijoittelu.jatkuva.resource; + +import fi.vm.sade.sijoittelu.jatkuva.dao.JatkuvaSijoitteluDAO; +import fi.vm.sade.sijoittelu.jatkuva.dto.JatkuvaSijoittelu; +import fi.vm.sade.testing.AbstractIntegrationTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ActiveProfiles; + +import java.time.Instant; +import java.time.temporal.ChronoField; +import java.util.Date; + +@ActiveProfiles("test") +public class SijoitteluAktivointiResourceTest extends AbstractIntegrationTest { + + @Autowired + private JatkuvaSijoitteluDAO jatkuvaSijoitteluDAO; + + @Test + public void testSijoitteluDAO() { + String hakuOID = "hakuOID"; + Instant aloitus = Instant.now().with(ChronoField.MICRO_OF_SECOND, 0); + int ajotiheys = 5; + + // tallennetaan haun tiedot + this.jatkuvaSijoitteluDAO.paivitaSijoittelunAloitusajankohta( + hakuOID, + aloitus.toEpochMilli(), + ajotiheys); + + // oid:lla hakeminen palauttaa samat tiedot + JatkuvaSijoittelu jatkuvaSijoittelu = this.jatkuvaSijoitteluDAO.hae(hakuOID); + Assertions.assertEquals(hakuOID, jatkuvaSijoittelu.getHakuOid()); + Assertions.assertEquals(aloitus, jatkuvaSijoittelu.getAloitusajankohta().toInstant()); + Assertions.assertEquals(ajotiheys, jatkuvaSijoittelu.getAjotiheys()); + Assertions.assertEquals(false, jatkuvaSijoittelu.isAjossa()); + Assertions.assertEquals(null, jatkuvaSijoittelu.getViimeksiAjettu()); + Assertions.assertEquals(null, jatkuvaSijoittelu.getVirhe()); + + // kaikki haut sisältävät vain tallennetun haun + Assertions.assertEquals(1, this.jatkuvaSijoitteluDAO.hae().size()); + Assertions.assertEquals(hakuOID, this.jatkuvaSijoitteluDAO.hae().iterator().next().getHakuOid()); + + // ajossatila päivittyy oikein + this.jatkuvaSijoitteluDAO.merkkaaSijoittelunAjossaTila(hakuOID, true); + Assertions.assertEquals(true, this.jatkuvaSijoitteluDAO.hae(hakuOID).isAjossa()); + + // merkkaa ajetuksi timestamp päivittyy oikein + this.jatkuvaSijoitteluDAO.merkkaaSijoittelunAjetuksi(hakuOID); + Assertions.assertTrue(this.jatkuvaSijoitteluDAO.hae(hakuOID).getViimeksiAjettu() + .before(new Date())); + Assertions.assertTrue(this.jatkuvaSijoitteluDAO.hae(hakuOID).getViimeksiAjettu() + .after(Date.from(Instant.now().minusSeconds(1)))); + + // sijoittelun poisto toimii + this.jatkuvaSijoitteluDAO.poistaSijoittelu(hakuOID); + Assertions.assertEquals(null, this.jatkuvaSijoitteluDAO.hae(hakuOID)); + } +}