From 8693a99880d6314ca8be34a9e7bda84a574e01aa Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Wed, 5 Jul 2023 10:19:26 +0300 Subject: [PATCH] moved common code --- .../models/common/JSONPrimitive.java | 20 +++ .../providers/models/common/Page.java | 27 ++++ .../providers/utils/MagicConverter.java | 125 ++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 src/main/java/com/knecon/fforesight/databasetenantcommons/providers/models/common/JSONPrimitive.java create mode 100644 src/main/java/com/knecon/fforesight/databasetenantcommons/providers/models/common/Page.java create mode 100644 src/main/java/com/knecon/fforesight/databasetenantcommons/providers/utils/MagicConverter.java diff --git a/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/models/common/JSONPrimitive.java b/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/models/common/JSONPrimitive.java new file mode 100644 index 0000000..6d8228e --- /dev/null +++ b/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/models/common/JSONPrimitive.java @@ -0,0 +1,20 @@ +package com.knecon.fforesight.databasetenantcommons.providers.models.common; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; + +@Data +@EqualsAndHashCode(of = "value") +@RequiredArgsConstructor +public class JSONPrimitive { + + private final T value; + + + public static JSONPrimitive of(T value) { + + return new JSONPrimitive<>(value); + } + +} diff --git a/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/models/common/Page.java b/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/models/common/Page.java new file mode 100644 index 0000000..da71814 --- /dev/null +++ b/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/models/common/Page.java @@ -0,0 +1,27 @@ +package com.knecon.fforesight.databasetenantcommons.providers.models.common; + +import java.util.ArrayList; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Data +@Builder +public class Page { + + @Builder.Default + protected List elements = new ArrayList<>(); + protected long totalHits; + protected int page; + protected int pageSize; + + public List getData(){ + return this.elements; + } + +} diff --git a/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/utils/MagicConverter.java b/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/utils/MagicConverter.java new file mode 100644 index 0000000..9e4165e --- /dev/null +++ b/src/main/java/com/knecon/fforesight/databasetenantcommons/providers/utils/MagicConverter.java @@ -0,0 +1,125 @@ +package com.knecon.fforesight.databasetenantcommons.providers.utils; + +import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.BiConsumer; + +import org.springframework.beans.BeanUtils; + +import com.google.common.collect.Lists; +import com.knecon.fforesight.databasetenantcommons.providers.models.common.Page; + +import jakarta.persistence.EmbeddedId; +import lombok.SneakyThrows; + +public class MagicConverter { + + @SneakyThrows + public static T convert(S source, Class target, BiConsumer deltaMapper) { + + if (deltaMapper != null) { + var targetObject = convert(source, target); + deltaMapper.accept(source, targetObject); + return targetObject; + } else { + return convert(source, target); + } + } + + + @SneakyThrows + public static T convert(S source, Class target) { + + var noArgsConstructor = target.getConstructor(); + return convertOne(source, target, noArgsConstructor); + } + + + @SneakyThrows + public static T convertOne(S source, Class target, Constructor constructor) { + + var newInstance = constructor.newInstance(); + BeanUtils.copyProperties(source, newInstance); + + for (var field : target.getDeclaredFields()) { + if (field.getAnnotation(EmbeddedId.class) != null) { + field.setAccessible(true); + var id = field.getType().getConstructor().newInstance(); + BeanUtils.copyProperties(source, id); + field.set(newInstance, id); + + } + } + + for (var field : source.getClass().getDeclaredFields()) { + if (field.getAnnotation(EmbeddedId.class) != null) { + field.setAccessible(true); + var sourceId = field.get(source); + BeanUtils.copyProperties(sourceId, newInstance); + } + } + + return newInstance; + } + + + @SneakyThrows + public static List convert(List sources, Class target, BiConsumer deltaMapper) { + + if (deltaMapper != null) { + var targetList = convert(sources, target); + for (int i = 0; i < targetList.size(); i++) { + deltaMapper.accept(sources.get(i), targetList.get(i)); + } + return targetList; + } else { + return convert(sources, target); + } + + } + + + @SneakyThrows + public static List convert(List sources, Class target) { + + var noArgsConstructor = target.getConstructor(); + + List targetList = new ArrayList<>(); + for (var s : sources) { + targetList.add(convertOne(s, target, noArgsConstructor)); + } + return targetList; + + } + + + @SneakyThrows + public static Page convert(org.springframework.data.domain.Page sources, Class target) { + + Page result = new Page<>(); + result.setElements(convert(Lists.newArrayList(sources), target)); + result.setPage(sources.getNumber()); + result.setPageSize(sources.getSize()); + result.setTotalHits(sources.getTotalElements()); + return result; + + } + + + @SneakyThrows + public static Set convert(Set sources, Class target) { + + var noArgsConstructor = target.getConstructor(); + + Set targetList = new HashSet<>(); + for (var s : sources) { + targetList.add(convertOne(s, target, noArgsConstructor)); + } + return targetList; + + } + +}