Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OK-798 kaavat jsonb:hen #92

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions valintaperusteet-domain/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
<name>Valintaperusteet :: Domain</name>

<dependencies>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fi.vm.sade.service.valintaperusteet.model;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import jakarta.persistence.*;

@Entity
Expand All @@ -14,6 +15,7 @@ public class Arvokonvertteriparametri extends Konvertteriparametri {

@JoinColumn(name = "tekstiryhma_id", nullable = true)
@ManyToOne(fetch = FetchType.LAZY, optional = true)
@JsonSerialize(using = TekstiRyhmaSerializer.class)
private TekstiRyhma kuvaukset;

public String getArvo() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fi.vm.sade.service.valintaperusteet.model;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import jakarta.persistence.*;

@Entity
Expand Down Expand Up @@ -35,6 +36,7 @@ public String toString() {

@JoinColumn(name = "tekstiryhma_id", nullable = true)
@ManyToOne(fetch = FetchType.LAZY, optional = true)
@JsonSerialize(using = TekstiRyhmaSerializer.class)
private TekstiRyhma kuvaukset;

public String getMinValue() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fi.vm.sade.service.valintaperusteet.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import java.io.Serializable;

Expand All @@ -13,6 +14,7 @@ public class BaseEntity implements Serializable {
@Id
@Column(name = ID_COLUMN_NAME, unique = true, nullable = false)
@GeneratedValue
@JsonIgnore
private Long id;

@Version
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package fi.vm.sade.service.valintaperusteet.model;

import jakarta.persistence.EntityManager;

public class EntityManagerUtils {

private static EntityManager em;

public static void setEntityManager(EntityManager em) {
EntityManagerUtils.em = em;
}

public static EntityManager getEntityManager() {
return em;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
package fi.vm.sade.service.valintaperusteet.model;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import jakarta.persistence.*;
import jakarta.validation.constraints.Min;
import java.io.IOException;

@Entity
@Table(name = "funktioargumentti")
Expand All @@ -10,6 +20,7 @@ public class Funktioargumentti extends BaseEntity implements Comparable<Funktioa

@JoinColumn(name = "funktiokutsuparent_id", nullable = false)
@ManyToOne(optional = false, cascade = CascadeType.PERSIST)
@JsonBackReference
private Funktiokutsu parent;

@JoinColumn(name = "funktiokutsuchild_id", nullable = true)
Expand All @@ -18,6 +29,8 @@ public class Funktioargumentti extends BaseEntity implements Comparable<Funktioa

@JoinColumn(name = "laskentakaavachild_id", nullable = true)
@ManyToOne(cascade = CascadeType.PERSIST)
@JsonSerialize(using = CustomLaskentakaavaSerializer.class)
@JsonDeserialize(using = CustomLaskentakaavaDeserializer.class)
private Laskentakaava laskentakaavaChild;

@Min(1)
Expand Down Expand Up @@ -70,4 +83,26 @@ public void setLaajennettuKaava(Funktiokutsu laajennettuKaava) {
public int compareTo(Funktioargumentti o) {
return indeksi - o.indeksi;
}

static class CustomLaskentakaavaSerializer extends JsonSerializer<Laskentakaava> {

@Override
public void serialize(Laskentakaava value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
gen.writeNumber(value.getId());
}
}

static class CustomLaskentakaavaDeserializer extends JsonDeserializer<Laskentakaava> {

@Override
public Laskentakaava deserialize(JsonParser p, DeserializationContext ctxt) {
try {
return EntityManagerUtils.getEntityManager()
.find(Laskentakaava.class, p.getNumberValue().longValue());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fi.vm.sade.service.valintaperusteet.model;

import com.fasterxml.jackson.annotation.JsonBackReference;
import jakarta.persistence.*;

@MappedSuperclass
Expand All @@ -9,6 +10,7 @@ public abstract class Konvertteriparametri extends BaseEntity {

@JoinColumn(name = "funktiokutsu_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JsonBackReference
private Funktiokutsu funktiokutsu;

public String getPaluuarvo() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,13 @@
package fi.vm.sade.service.valintaperusteet.model;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.*;
import fi.vm.sade.service.valintaperusteet.dto.model.Funktiotyyppi;
import jakarta.persistence.Cacheable;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import jakarta.persistence.Table;
import jakarta.persistence.*;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;

@Entity
@Table(name = "laskentakaava")
Expand Down Expand Up @@ -56,6 +48,11 @@ public class Laskentakaava extends BaseEntity implements FunktionArgumentti {
@OneToMany(fetch = FetchType.LAZY, mappedBy = "laskentakaava", cascade = CascadeType.PERSIST)
private Set<Jarjestyskriteeri> jarjestyskriteerit = new HashSet<Jarjestyskriteeri>();

@JdbcTypeCode(SqlTypes.JSON)
@Column(columnDefinition = "jsonb")
@Convert(converter = JsonNodeConverter.class)
private Funktiokutsu kaava;

public Boolean getOnLuonnos() {
return onLuonnos;
}
Expand Down Expand Up @@ -97,11 +94,15 @@ public void setHakukohde(HakukohdeViite hakukohde) {
}

public Funktiokutsu getFunktiokutsu() {
if (this.kaava != null) {
return this.kaava;
}
return funktiokutsu;
}

public void setFunktiokutsu(Funktiokutsu funktiokutsu) {
this.funktiokutsu = funktiokutsu;
this.kaava = funktiokutsu;
}

public Funktiotyyppi getTyyppi() {
Expand All @@ -128,6 +129,10 @@ public void setKopiot(Set<Laskentakaava> kopiot) {
this.kopiot = kopiot;
}

public void migrateKaava() {
this.kaava = this.funktiokutsu;
}

@Override
public Long getId() {
return super.getId();
Expand Down Expand Up @@ -163,4 +168,28 @@ public Laskentakaava getKopioLaskentakaavasta() {
public void setKopioLaskentakaavasta(Laskentakaava kopioLaskentakaavasta) {
this.kopioLaskentakaavasta = kopioLaskentakaavasta;
}

@Converter(autoApply = true)
static class JsonNodeConverter implements AttributeConverter<Funktiokutsu, String> {

private final ObjectMapper objectMapper = new ObjectMapper();

@Override
public String convertToDatabaseColumn(Funktiokutsu funktiokutsu) {
try {
return objectMapper.writeValueAsString(funktiokutsu);
} catch (JsonProcessingException e) {
throw new RuntimeException("Error while serializing JsonNode to JSON", e);
}
}

@Override
public Funktiokutsu convertToEntityAttribute(String dbData) {
try {
return dbData == null ? null : objectMapper.readValue(dbData, Funktiokutsu.class);
} catch (JsonProcessingException e) {
throw new RuntimeException("Error while deserializing JSON to JsonNode", e);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fi.vm.sade.service.valintaperusteet.model;

import com.fasterxml.jackson.annotation.JsonBackReference;
import fi.vm.sade.service.valintaperusteet.dto.model.Kieli;
import jakarta.persistence.*;

Expand All @@ -19,6 +20,7 @@ public class LokalisoituTeksti extends BaseEntity {

@JoinColumn(name = "tekstiryhma_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JsonBackReference
private TekstiRyhma ryhma;

public String getTeksti() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fi.vm.sade.service.valintaperusteet.model;

import com.fasterxml.jackson.annotation.JsonBackReference;
import jakarta.persistence.*;

@Entity
Expand All @@ -14,6 +15,7 @@ public class Syoteparametri extends BaseEntity {

@JoinColumn(name = "funktiokutsu_id", nullable = false)
@ManyToOne(optional = false)
@JsonBackReference
private Funktiokutsu funktiokutsu;

public String getAvain() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package fi.vm.sade.service.valintaperusteet.model;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class TekstiRyhmaSerializer extends JsonSerializer<TekstiRyhma> {

@Override
public void serialize(TekstiRyhma value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
Map<String, Object> map = new HashMap<>();
map.put("id", value.getId());
map.put("tekstit", value.getTekstit());
map.put("version", value.getVersion());
gen.writeObject(map);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package fi.vm.sade.service.valintaperusteet.model;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import fi.vm.sade.service.valintaperusteet.dto.model.Valintaperustelahde;
import jakarta.persistence.*;

Expand Down Expand Up @@ -28,6 +30,7 @@ public class ValintaperusteViite extends BaseEntity implements Comparable<Valint

@JoinColumn(name = "funktiokutsu_id", nullable = false)
@ManyToOne(optional = false)
@JsonBackReference
private Funktiokutsu funktiokutsu;

@Column(name = "on_pakollinen", nullable = false)
Expand All @@ -44,6 +47,7 @@ public class ValintaperusteViite extends BaseEntity implements Comparable<Valint

@JoinColumn(name = "tekstiryhma_id", nullable = true)
@ManyToOne(fetch = FetchType.LAZY, optional = true)
@JsonSerialize(using = TekstiRyhmaSerializer.class)
private TekstiRyhma kuvaukset;

// VT-854 mahdollistetaan syötettävien arvojen pistesyöttö ilman laskentaa
Expand Down Expand Up @@ -117,6 +121,7 @@ public void setIndeksi(Integer indeksi) {
}

@Transient
@JsonBackReference
public String getOsallistuminenTunniste() {
String osallistuminenTunniste = null;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package fi.vm.sade.service.valintaperusteet.model;

import com.fasterxml.jackson.annotation.JsonBackReference;
import jakarta.persistence.*;
import java.util.*;

Expand All @@ -26,6 +27,7 @@ public class Valintaryhma extends BaseEntity {

@JoinColumn(name = "parent_id")
@ManyToOne(fetch = FetchType.LAZY)
@JsonBackReference
private Valintaryhma ylavalintaryhma;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "ylavalintaryhma")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class App {
public static final String CONTEXT_PATH = "/valintaperusteet-service";

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package fi.vm.sade.service.valintaperusteet.config;

import fi.vm.sade.service.valintaperusteet.model.EntityManagerUtils;
import jakarta.persistence.EntityManager;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

@Configuration
public class EntityManagerConfiguration implements InitializingBean {

@Autowired private EntityManager entityManager;

public void afterPropertiesSet() throws Exception {
EntityManagerUtils.setEntityManager(this.entityManager);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.querydsl.core.Tuple;
import fi.vm.sade.service.valintaperusteet.model.Laskentakaava;
import java.util.List;
import java.util.Optional;

public interface LaskentakaavaDAO extends JpaDAO<Laskentakaava, Long> {
Laskentakaava getLaskentakaava(Long id);
Expand All @@ -23,5 +24,7 @@ List<Laskentakaava> findKaavas(
String hakukohdeOid,
fi.vm.sade.service.valintaperusteet.dto.model.Funktiotyyppi tyyppi);

Optional<Long> migrateLaskentakaavat();

void flush();
}
Loading
Loading