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 @@ ...@@ -114,7 +114,7 @@
<dependency> <dependency>
<groupId>one.util</groupId> <groupId>one.util</groupId>
<artifactId>streamex</artifactId> <artifactId>streamex</artifactId>
<version>0.6.5</version> <version>0.7.3</version>
</dependency> </dependency>
</dependencies> </dependencies>
......
package cz.muni.fi.pa165.winery.webapp.components; package cz.muni.fi.pa165.winery.webapp.components;
import com.fasterxml.jackson.databind.util.ClassUtil;
import cz.muni.fi.pa165.winery.webapp.seeders.*; import cz.muni.fi.pa165.winery.webapp.seeders.*;
import one.util.streamex.StreamEx;
import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -12,25 +17,21 @@ import java.util.Map; ...@@ -12,25 +17,21 @@ import java.util.Map;
@Component @Component
public class DataSeederComponent implements DataSeederContext { public class DataSeederComponent implements DataSeederContext {
// Order-sensitive! private final Collection<DataSeeder> seeders;
static final List<DataSeeder> SEEDERS = List.of(
new GrapeDataSeeder(), public DataSeederComponent(Collection<DataSeeder> seeders) {
new HarvestDataSeeder(),
new UserDataSeeder(), this.seeders = StreamEx.of(seeders.stream())
new UserRoleDataSeeder(), .sortedBy(x -> getSeederOrder((Class<DataSeeder>)x.getClass()))
new WineTypeDataSeeder(), .toList();
new WineBottleDataSeeder(), }
new ProductReviewDataSeeder(),
new OrderDataSeeder(),
new OrderItemDataSeeder()
);
private Map<String, List<Object>> seededObjects = new HashMap<>(); private Map<String, List<Object>> seededObjects = new HashMap<>();
@EventListener @EventListener
public void handleContextRefresh(ContextRefreshedEvent event) { public void handleContextRefresh(ContextRefreshedEvent event) {
var context = event.getApplicationContext(); var context = event.getApplicationContext();
for (var seeder : SEEDERS) { for (var seeder : seeders) {
var dtos = seeder.seed(context, this); var dtos = seeder.seed(context, this);
if (!dtos.isEmpty()) { if (!dtos.isEmpty()) {
seededObjects.put(dtos.get(0).getClass().getName(), dtos); seededObjects.put(dtos.get(0).getClass().getName(), dtos);
...@@ -42,4 +43,13 @@ public class DataSeederComponent implements DataSeederContext { ...@@ -42,4 +43,13 @@ public class DataSeederComponent implements DataSeederContext {
public <T> List<T> getSeededData(Class<T> type) { public <T> List<T> getSeededData(Class<T> type) {
return (List<T>) seededObjects.getOrDefault(type.getName(), null); 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; ...@@ -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.PersistenceService;
import cz.muni.fi.pa165.winery.services.wine.GrapeService; import cz.muni.fi.pa165.winery.services.wine.GrapeService;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
@Component
@Order(0)
public class GrapeDataSeeder extends DataSeederBase<GrapeDto, GrapeService> { public class GrapeDataSeeder extends DataSeederBase<GrapeDto, GrapeService> {
@Override @Override
protected Class<GrapeService> getPersistenceServiceClass() { protected Class<GrapeService> getPersistenceServiceClass() {
......
...@@ -4,10 +4,14 @@ import cz.muni.fi.pa165.winery.dto.wine.GrapeDto; ...@@ -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.dto.wine.HarvestDto;
import cz.muni.fi.pa165.winery.services.wine.HarvestService; import cz.muni.fi.pa165.winery.services.wine.HarvestService;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
@Component
@Order(1)
public class HarvestDataSeeder extends DataSeederBase<HarvestDto, HarvestService> { public class HarvestDataSeeder extends DataSeederBase<HarvestDto, HarvestService> {
@Override @Override
protected Class<HarvestService> getPersistenceServiceClass() { protected Class<HarvestService> getPersistenceServiceClass() {
......
...@@ -6,6 +6,8 @@ import cz.muni.fi.pa165.winery.dto.user.UserDto; ...@@ -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.dto.wine.GrapeDto;
import cz.muni.fi.pa165.winery.services.order.OrderService; import cz.muni.fi.pa165.winery.services.order.OrderService;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Collections; import java.util.Collections;
...@@ -13,6 +15,8 @@ import java.util.HashSet; ...@@ -13,6 +15,8 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@Component
@Order(7)
public class OrderDataSeeder extends DataSeederBase<OrderDto, OrderService> { public class OrderDataSeeder extends DataSeederBase<OrderDto, OrderService> {
@Override @Override
protected Class<OrderService> getPersistenceServiceClass() { protected Class<OrderService> getPersistenceServiceClass() {
......
...@@ -8,11 +8,15 @@ import cz.muni.fi.pa165.winery.dto.wine.WineBottleDto; ...@@ -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.order.OrderItemService;
import cz.muni.fi.pa165.winery.services.wine.HarvestService; import cz.muni.fi.pa165.winery.services.wine.HarvestService;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@Component
@Order(8)
public class OrderItemDataSeeder extends DataSeederBase<OrderItemDto, OrderItemService> { public class OrderItemDataSeeder extends DataSeederBase<OrderItemDto, OrderItemService> {
@Override @Override
protected Class<OrderItemService> getPersistenceServiceClass() { protected Class<OrderItemService> getPersistenceServiceClass() {
......
...@@ -5,12 +5,16 @@ import cz.muni.fi.pa165.winery.dto.user.UserDto; ...@@ -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.dto.wine.WineBottleDto;
import cz.muni.fi.pa165.winery.services.review.ProductReviewService; import cz.muni.fi.pa165.winery.services.review.ProductReviewService;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
/** /**
* @author Michaela Korenkova * @author Michaela Korenkova
*/ */
@Component
@Order(6)
public class ProductReviewDataSeeder extends DataSeederBase<ProductReviewDto, ProductReviewService>{ public class ProductReviewDataSeeder extends DataSeederBase<ProductReviewDto, ProductReviewService>{
@Override @Override
protected Class<ProductReviewService> getPersistenceServiceClass() { protected Class<ProductReviewService> getPersistenceServiceClass() {
......
...@@ -4,10 +4,14 @@ import cz.muni.fi.pa165.winery.dto.user.UserDto; ...@@ -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.enums.UserRoleType;
import cz.muni.fi.pa165.winery.services.user.UserService; import cz.muni.fi.pa165.winery.services.user.UserService;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
@Component
@Order(2)
public class UserDataSeeder extends DataSeederBase<UserDto, UserService> { public class UserDataSeeder extends DataSeederBase<UserDto, UserService> {
@Override @Override
protected Class<UserService> getPersistenceServiceClass() { protected Class<UserService> getPersistenceServiceClass() {
......
...@@ -5,9 +5,13 @@ import cz.muni.fi.pa165.winery.dto.user.UserRoleDto; ...@@ -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.enums.UserRoleType;
import cz.muni.fi.pa165.winery.services.user.UserRoleService; import cz.muni.fi.pa165.winery.services.user.UserRoleService;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
@Component
@Order(3)
public class UserRoleDataSeeder extends DataSeederBase<UserRoleDto, UserRoleService> { public class UserRoleDataSeeder extends DataSeederBase<UserRoleDto, UserRoleService> {
@Override @Override
protected Class<UserRoleService> getPersistenceServiceClass() { protected Class<UserRoleService> getPersistenceServiceClass() {
......
...@@ -5,6 +5,8 @@ import cz.muni.fi.pa165.winery.dto.wine.WineBottleDto; ...@@ -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.dto.wine.WineTypeDto;
import cz.muni.fi.pa165.winery.services.wine.WineBottleService; import cz.muni.fi.pa165.winery.services.wine.WineBottleService;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
...@@ -12,6 +14,8 @@ import java.util.List; ...@@ -12,6 +14,8 @@ import java.util.List;
/** /**
* @author Michaela Korenkova * @author Michaela Korenkova
*/ */
@Component
@Order(5)
public class WineBottleDataSeeder extends DataSeederBase<WineBottleDto, WineBottleService>{ public class WineBottleDataSeeder extends DataSeederBase<WineBottleDto, WineBottleService>{
@Override @Override
......
...@@ -4,12 +4,16 @@ import cz.muni.fi.pa165.winery.dto.wine.GrapeDto; ...@@ -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.dto.wine.WineTypeDto;
import cz.muni.fi.pa165.winery.services.wine.WineTypeService; import cz.muni.fi.pa165.winery.services.wine.WineTypeService;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
/** /**
* @author Michaela Korenkova * @author Michaela Korenkova
*/ */
@Component
@Order(4)
public class WineTypeDataSeeder extends DataSeederBase<WineTypeDto, WineTypeService>{ public class WineTypeDataSeeder extends DataSeederBase<WineTypeDto, WineTypeService>{
@Override @Override
protected Class<WineTypeService> getPersistenceServiceClass() { 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