Commit 3007ef20 authored by Ondřej Pavlica's avatar Ondřej Pavlica
Browse files

Change seeder order definition to annotations instead of a static list

parent 2d7b36c0
Pipeline #142392 passed with stages
in 1 minute and 57 seconds
......@@ -114,7 +114,7 @@
<dependency>
<groupId>one.util</groupId>
<artifactId>streamex</artifactId>
<version>0.6.5</version>
<version>0.7.3</version>
</dependency>
</dependencies>
......
package cz.muni.fi.pa165.winery.webapp.components;
import com.fasterxml.jackson.databind.util.ClassUtil;
import cz.muni.fi.pa165.winery.webapp.seeders.*;
import one.util.streamex.StreamEx;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -12,25 +17,21 @@ import java.util.Map;
@Component
public class DataSeederComponent implements DataSeederContext {
// Order-sensitive!
static final List<DataSeeder> SEEDERS = List.of(
new GrapeDataSeeder(),
new HarvestDataSeeder(),
new UserDataSeeder(),
new UserRoleDataSeeder(),
new WineTypeDataSeeder(),
new WineBottleDataSeeder(),
new ProductReviewDataSeeder(),
new OrderDataSeeder(),
new OrderItemDataSeeder()
);
private final Collection<DataSeeder> seeders;
public DataSeederComponent(Collection<DataSeeder> seeders) {
this.seeders = StreamEx.of(seeders.stream())
.sortedBy(x -> getSeederOrder((Class<DataSeeder>)x.getClass()))
.toList();
}
private Map<String, List<Object>> seededObjects = new HashMap<>();
@EventListener
public void handleContextRefresh(ContextRefreshedEvent event) {
var context = event.getApplicationContext();
for (var seeder : SEEDERS) {
for (var seeder : seeders) {
var dtos = seeder.seed(context, this);
if (!dtos.isEmpty()) {
seededObjects.put(dtos.get(0).getClass().getName(), dtos);
......@@ -42,4 +43,13 @@ public class DataSeederComponent implements DataSeederContext {
public <T> List<T> getSeededData(Class<T> type) {
return (List<T>) seededObjects.getOrDefault(type.getName(), null);
}
private long getSeederOrder(Class<DataSeeder> seederClass) {
var nonProxyClass = ClassUtils.getUserClass(seederClass);
var orderAnnotation = nonProxyClass.getAnnotation(Order.class);
if (orderAnnotation == null) {
return Long.MAX_VALUE;
}
return orderAnnotation.value();
}
}
......@@ -4,9 +4,13 @@ import cz.muni.fi.pa165.winery.dto.wine.GrapeDto;
import cz.muni.fi.pa165.winery.services.PersistenceService;
import cz.muni.fi.pa165.winery.services.wine.GrapeService;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Order(0)
public class GrapeDataSeeder extends DataSeederBase<GrapeDto, GrapeService> {
@Override
protected Class<GrapeService> getPersistenceServiceClass() {
......
......@@ -4,10 +4,14 @@ import cz.muni.fi.pa165.winery.dto.wine.GrapeDto;
import cz.muni.fi.pa165.winery.dto.wine.HarvestDto;
import cz.muni.fi.pa165.winery.services.wine.HarvestService;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.List;
@Component
@Order(1)
public class HarvestDataSeeder extends DataSeederBase<HarvestDto, HarvestService> {
@Override
protected Class<HarvestService> getPersistenceServiceClass() {
......
......@@ -6,6 +6,8 @@ import cz.muni.fi.pa165.winery.dto.user.UserDto;
import cz.muni.fi.pa165.winery.dto.wine.GrapeDto;
import cz.muni.fi.pa165.winery.services.order.OrderService;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Collections;
......@@ -13,6 +15,8 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Component
@Order(7)
public class OrderDataSeeder extends DataSeederBase<OrderDto, OrderService> {
@Override
protected Class<OrderService> getPersistenceServiceClass() {
......
......@@ -8,11 +8,15 @@ import cz.muni.fi.pa165.winery.dto.wine.WineBottleDto;
import cz.muni.fi.pa165.winery.services.order.OrderItemService;
import cz.muni.fi.pa165.winery.services.wine.HarvestService;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.List;
@Component
@Order(8)
public class OrderItemDataSeeder extends DataSeederBase<OrderItemDto, OrderItemService> {
@Override
protected Class<OrderItemService> getPersistenceServiceClass() {
......
......@@ -5,12 +5,16 @@ import cz.muni.fi.pa165.winery.dto.user.UserDto;
import cz.muni.fi.pa165.winery.dto.wine.WineBottleDto;
import cz.muni.fi.pa165.winery.services.review.ProductReviewService;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author Michaela Korenkova
*/
@Component
@Order(6)
public class ProductReviewDataSeeder extends DataSeederBase<ProductReviewDto, ProductReviewService>{
@Override
protected Class<ProductReviewService> getPersistenceServiceClass() {
......
......@@ -4,10 +4,14 @@ import cz.muni.fi.pa165.winery.dto.user.UserDto;
import cz.muni.fi.pa165.winery.enums.UserRoleType;
import cz.muni.fi.pa165.winery.services.user.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Order(2)
public class UserDataSeeder extends DataSeederBase<UserDto, UserService> {
@Override
protected Class<UserService> getPersistenceServiceClass() {
......
......@@ -5,9 +5,13 @@ import cz.muni.fi.pa165.winery.dto.user.UserRoleDto;
import cz.muni.fi.pa165.winery.enums.UserRoleType;
import cz.muni.fi.pa165.winery.services.user.UserRoleService;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Order(3)
public class UserRoleDataSeeder extends DataSeederBase<UserRoleDto, UserRoleService> {
@Override
protected Class<UserRoleService> getPersistenceServiceClass() {
......
......@@ -5,6 +5,8 @@ import cz.muni.fi.pa165.winery.dto.wine.WineBottleDto;
import cz.muni.fi.pa165.winery.dto.wine.WineTypeDto;
import cz.muni.fi.pa165.winery.services.wine.WineBottleService;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.List;
......@@ -12,6 +14,8 @@ import java.util.List;
/**
* @author Michaela Korenkova
*/
@Component
@Order(5)
public class WineBottleDataSeeder extends DataSeederBase<WineBottleDto, WineBottleService>{
@Override
......
......@@ -4,12 +4,16 @@ import cz.muni.fi.pa165.winery.dto.wine.GrapeDto;
import cz.muni.fi.pa165.winery.dto.wine.WineTypeDto;
import cz.muni.fi.pa165.winery.services.wine.WineTypeService;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author Michaela Korenkova
*/
@Component
@Order(4)
public class WineTypeDataSeeder extends DataSeederBase<WineTypeDto, WineTypeService>{
@Override
protected Class<WineTypeService> getPersistenceServiceClass() {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment