From 83a41d8304d47aaa56d4b22319d43292dfdc381e Mon Sep 17 00:00:00 2001 From: Vlad Date: Thu, 22 Oct 2020 22:42:25 +0400 Subject: [PATCH] Added business logic and tests --- pom.xml | 24 ++++++++ .../core/template/SpringCoreTemplate.java | 20 ++++++- .../template/configuration/ColorFactory.java | 19 ++++++ .../InitializerConfiguration.java | 24 +++++++- .../configuration/MainConfiguration.java | 34 +++++++++++ .../RepositoryConfiguration.java | 34 +++++++++++ .../edu/spring/core/template/entity/Item.java | 1 + .../repository/ArrayListItemRepository.java | 22 +++++-- .../template/repository/InjectRandomInt.java | 10 ++++ ...tRandomIntAnnotationBeanPostProcessor.java | 39 ++++++++++++ .../repository/LinkedListItemRepository.java | 19 ++++-- .../template/service/SimpleItemService.java | 30 +++++++++- .../validator/SimpleItemValidator.java | 3 +- .../core/template/BusinessLogicTest.java | 50 ++++++++++++++++ .../spring/core/template/LoadContextTest.java | 60 +++++++++++++++++++ 15 files changed, 376 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/epam/edu/spring/core/template/configuration/ColorFactory.java create mode 100644 src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomInt.java create mode 100644 src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomIntAnnotationBeanPostProcessor.java create mode 100644 src/test/java/com/epam/edu/spring/core/template/BusinessLogicTest.java create mode 100644 src/test/java/com/epam/edu/spring/core/template/LoadContextTest.java diff --git a/pom.xml b/pom.xml index 541b54d..900c99a 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,30 @@ spring-core-template 0.0.1-SNAPSHOT + + + + + org.springframework + spring-context + 5.2.1.RELEASE + + + org.springframework + spring-test + 5.2.1.RELEASE + + + junit + junit + 4.12 + test + + + + + + 1.8 1.8 diff --git a/src/main/java/com/epam/edu/spring/core/template/SpringCoreTemplate.java b/src/main/java/com/epam/edu/spring/core/template/SpringCoreTemplate.java index ea1a0a1..308cc81 100644 --- a/src/main/java/com/epam/edu/spring/core/template/SpringCoreTemplate.java +++ b/src/main/java/com/epam/edu/spring/core/template/SpringCoreTemplate.java @@ -1,9 +1,27 @@ package com.epam.edu.spring.core.template; +import com.epam.edu.spring.core.template.configuration.ColorFactory; +import com.epam.edu.spring.core.template.configuration.MainConfiguration; +import com.epam.edu.spring.core.template.repository.ArrayListItemRepository; +import com.epam.edu.spring.core.template.repository.LinkedListItemRepository; +import com.epam.edu.spring.core.template.service.SimpleItemService; +import com.epam.edu.spring.core.template.validator.ItemValidator; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + public class SpringCoreTemplate { - public static void main(String[] args) { + public static void main(String[] args) throws Exception { + ApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfiguration.class); + + ItemValidator itemValidator = ctx.getBean(ItemValidator.class); + SimpleItemService itemServiceConstructor = (SimpleItemService) ctx.getBean("itemServiceConstructor"); + SimpleItemService itemServiceSetter = (SimpleItemService) ctx.getBean("itemServiceSetter"); + + LinkedListItemRepository linkedListItemRepository = ctx.getBean(LinkedListItemRepository.class); + ArrayListItemRepository arrayListItemRepository = ctx.getBean(ArrayListItemRepository.class); + ColorFactory colorFactory = ctx.getBean(ColorFactory.class); } } diff --git a/src/main/java/com/epam/edu/spring/core/template/configuration/ColorFactory.java b/src/main/java/com/epam/edu/spring/core/template/configuration/ColorFactory.java new file mode 100644 index 0000000..ac768e4 --- /dev/null +++ b/src/main/java/com/epam/edu/spring/core/template/configuration/ColorFactory.java @@ -0,0 +1,19 @@ +package com.epam.edu.spring.core.template.configuration; + +import com.epam.edu.spring.core.template.entity.Color; +import org.springframework.context.annotation.Lazy; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.Random; + +@Component +@Lazy +public class ColorFactory { + + @Scope("prototype") + public Color getColor() { + return Color.values()[new Random().nextInt(Color.values().length)]; + } + +} diff --git a/src/main/java/com/epam/edu/spring/core/template/configuration/InitializerConfiguration.java b/src/main/java/com/epam/edu/spring/core/template/configuration/InitializerConfiguration.java index 444cc01..40a4dc1 100644 --- a/src/main/java/com/epam/edu/spring/core/template/configuration/InitializerConfiguration.java +++ b/src/main/java/com/epam/edu/spring/core/template/configuration/InitializerConfiguration.java @@ -1,4 +1,26 @@ package com.epam.edu.spring.core.template.configuration; -public class InitializerConfiguration { +import com.epam.edu.spring.core.template.entity.Color; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.context.annotation.Configuration; +import java.util.Objects; + +@Configuration +public class InitializerConfiguration implements FactoryBean { + + @Override + public ColorFactory getObject() { + return new ColorFactory(); + } + + @Override + public Class getObjectType() { + return ColorFactory.class; + } + + public Color getColor() throws Exception { + return Objects.requireNonNull(getObject()).getColor(); + } + } + diff --git a/src/main/java/com/epam/edu/spring/core/template/configuration/MainConfiguration.java b/src/main/java/com/epam/edu/spring/core/template/configuration/MainConfiguration.java index f1b7446..a1c0b02 100644 --- a/src/main/java/com/epam/edu/spring/core/template/configuration/MainConfiguration.java +++ b/src/main/java/com/epam/edu/spring/core/template/configuration/MainConfiguration.java @@ -1,4 +1,38 @@ package com.epam.edu.spring.core.template.configuration; +import com.epam.edu.spring.core.template.repository.InjectRandomIntAnnotationBeanPostProcessor; +import com.epam.edu.spring.core.template.service.SimpleItemService; +import com.epam.edu.spring.core.template.validator.ItemValidator; +import com.epam.edu.spring.core.template.validator.SimpleItemValidator; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.PropertySource; + +@Configuration +@PropertySource("classpath:application.properties") +@Import({ InitializerConfiguration.class, RepositoryConfiguration.class, InjectRandomIntAnnotationBeanPostProcessor.class}) public class MainConfiguration { + + @Bean + public ItemValidator itemValidator() { + return new SimpleItemValidator(); + } + + @Bean + @Qualifier("itemServiceConstructor") + public SimpleItemService itemServiceConstructor(RepositoryConfiguration repositoryConfiguration) { + return new SimpleItemService(repositoryConfiguration.getItemRepository(),itemValidator()); + } + + @Bean + public SimpleItemService itemServiceSetter(RepositoryConfiguration repositoryConfiguration) { + SimpleItemService simpleItemService = new SimpleItemService(); + simpleItemService.setItemRepository(repositoryConfiguration.getItemRepository()); + simpleItemService.setItemValidator(itemValidator()); + return simpleItemService; + } + } + diff --git a/src/main/java/com/epam/edu/spring/core/template/configuration/RepositoryConfiguration.java b/src/main/java/com/epam/edu/spring/core/template/configuration/RepositoryConfiguration.java index 40fb52c..b30f9fd 100644 --- a/src/main/java/com/epam/edu/spring/core/template/configuration/RepositoryConfiguration.java +++ b/src/main/java/com/epam/edu/spring/core/template/configuration/RepositoryConfiguration.java @@ -1,4 +1,38 @@ package com.epam.edu.spring.core.template.configuration; +import com.epam.edu.spring.core.template.repository.ArrayListItemRepository; +import com.epam.edu.spring.core.template.repository.ItemRepository; +import com.epam.edu.spring.core.template.repository.LinkedListItemRepository; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration public class RepositoryConfiguration { + + private ItemRepository itemRepository; + + @Bean + public ArrayListItemRepository arrayListItemRepository() { + return new ArrayListItemRepository(); + } + + @Bean + public LinkedListItemRepository linkedListItemRepository() { + return new LinkedListItemRepository(); + } + + @Value("${item.repository.implementation}") + private void initConfiguration (String implementation) { + if (implementation.equals("linked")) { + itemRepository = linkedListItemRepository(); + } else { + itemRepository = arrayListItemRepository(); + } + } + + public ItemRepository getItemRepository() { + return itemRepository; + } + } diff --git a/src/main/java/com/epam/edu/spring/core/template/entity/Item.java b/src/main/java/com/epam/edu/spring/core/template/entity/Item.java index d07b653..7fc2351 100644 --- a/src/main/java/com/epam/edu/spring/core/template/entity/Item.java +++ b/src/main/java/com/epam/edu/spring/core/template/entity/Item.java @@ -45,4 +45,5 @@ public Color getColor() { public void setColor(Color color) { this.color = color; } + } diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepository.java b/src/main/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepository.java index edcb085..7f66c8c 100644 --- a/src/main/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepository.java +++ b/src/main/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepository.java @@ -1,28 +1,42 @@ package com.epam.edu.spring.core.template.repository; import com.epam.edu.spring.core.template.entity.Item; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.PropertySource; +import javax.annotation.PostConstruct; +import java.util.ArrayList; /** * Репозиторий, основанный на классе ArrayList. * initialSequence должен браться из application.properties */ + +@PropertySource("classpath:application.properties") public class ArrayListItemRepository extends AbstractRepository implements ItemRepository { + @Override public Item getById(long id) { - return null; + return holder.stream().filter(o -> (o.getId() == id)).findFirst().orElse(null); } @Override public boolean createItem(Item item) { - return false; + item.setId(initialSequence); + holder.add(item); + initialSequence++; + return true; } + @Value("${initial.sequence}") + @Override void setInitialSequence(int val) { - //TODO + initialSequence = val; } + @PostConstruct void setHolder() { - //TODO + holder = new ArrayList<>(); } + } diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomInt.java b/src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomInt.java new file mode 100644 index 0000000..b00d851 --- /dev/null +++ b/src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomInt.java @@ -0,0 +1,10 @@ +package com.epam.edu.spring.core.template.repository; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface InjectRandomInt { + int min(); + int max(); +} diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomIntAnnotationBeanPostProcessor.java b/src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomIntAnnotationBeanPostProcessor.java new file mode 100644 index 0000000..1eaa85b --- /dev/null +++ b/src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomIntAnnotationBeanPostProcessor.java @@ -0,0 +1,39 @@ +package com.epam.edu.spring.core.template.repository; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.annotation.Configuration; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Random; + +@Configuration +public class InjectRandomIntAnnotationBeanPostProcessor implements BeanPostProcessor { + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + Method[] declaredMethods = bean.getClass().getDeclaredMethods(); + for (Method item : declaredMethods) { + InjectRandomInt annotation = item.getAnnotation(InjectRandomInt.class); + if (annotation != null) { + int min = annotation.min(); + int max = annotation.max(); + Random random = new Random(); + + try { + item.invoke(bean, random.nextInt(max - min) + min); + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + + } + } + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + return bean; + } + +} diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepository.java b/src/main/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepository.java index aa000f8..3002821 100644 --- a/src/main/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepository.java +++ b/src/main/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepository.java @@ -1,28 +1,39 @@ package com.epam.edu.spring.core.template.repository; import com.epam.edu.spring.core.template.entity.Item; +import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; +import java.util.LinkedList; /** * Репозиторий, основанный на классе LinkedList. * initialSequence должен случайно генерироваться из диапазона от 1 до 100 */ +@Component public class LinkedListItemRepository extends AbstractRepository implements ItemRepository { + @Override public Item getById(long id) { - return null; + return holder.stream().filter(o -> (o.getId() == id)).findFirst().orElse(null); } @Override public boolean createItem(Item item) { - return false; + item.setId(initialSequence); + holder.add(item); + initialSequence++; + return true; } + @InjectRandomInt(min = 1, max = 100) void setInitialSequence(int val) { - //TODO + initialSequence = val; } + @PostConstruct void setHolder() { - //TODO + holder = new LinkedList<>(); } + } diff --git a/src/main/java/com/epam/edu/spring/core/template/service/SimpleItemService.java b/src/main/java/com/epam/edu/spring/core/template/service/SimpleItemService.java index 802d512..5238c15 100644 --- a/src/main/java/com/epam/edu/spring/core/template/service/SimpleItemService.java +++ b/src/main/java/com/epam/edu/spring/core/template/service/SimpleItemService.java @@ -9,13 +9,39 @@ public class SimpleItemService implements ItemService { private ItemRepository itemRepository; private ItemValidator itemValidator; + public SimpleItemService() { + + } + + public SimpleItemService(ItemRepository itemRepository, ItemValidator itemValidator) { + this.itemRepository = itemRepository; + this.itemValidator = itemValidator; + } + @Override public Item getById(long id) { - return null; + return itemRepository.getById(id); } @Override public boolean createItem(Item item) { - return false; + if (itemValidator.isItemValid(item)) { + return itemRepository.createItem(item); + } else { + return false; + } + } + + public void setItemRepository(ItemRepository itemRepository) { + this.itemRepository = itemRepository; + } + + public ItemRepository getItemRepository() { + return itemRepository; } + + public void setItemValidator(ItemValidator itemValidator) { + this.itemValidator = itemValidator; + } + } diff --git a/src/main/java/com/epam/edu/spring/core/template/validator/SimpleItemValidator.java b/src/main/java/com/epam/edu/spring/core/template/validator/SimpleItemValidator.java index 003600b..47c8b2b 100644 --- a/src/main/java/com/epam/edu/spring/core/template/validator/SimpleItemValidator.java +++ b/src/main/java/com/epam/edu/spring/core/template/validator/SimpleItemValidator.java @@ -6,6 +6,7 @@ public class SimpleItemValidator implements ItemValidator { @Override public boolean isItemValid(Item item) { - return false; + return true; } + } diff --git a/src/test/java/com/epam/edu/spring/core/template/BusinessLogicTest.java b/src/test/java/com/epam/edu/spring/core/template/BusinessLogicTest.java new file mode 100644 index 0000000..5921536 --- /dev/null +++ b/src/test/java/com/epam/edu/spring/core/template/BusinessLogicTest.java @@ -0,0 +1,50 @@ +package com.epam.edu.spring.core.template; + +import com.epam.edu.spring.core.template.configuration.MainConfiguration; +import com.epam.edu.spring.core.template.entity.Item; +import com.epam.edu.spring.core.template.repository.ArrayListItemRepository; +import com.epam.edu.spring.core.template.repository.LinkedListItemRepository; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes=MainConfiguration.class) +public class BusinessLogicTest { + + @Autowired + private ArrayListItemRepository arrayListItemRepository; + @Autowired + private LinkedListItemRepository linkedListItemRepository; + + @Autowired + ApplicationContext ctx; + + @Test + public void createItemTest1() { + Item item = new Item(0,"item", 200, null); + arrayListItemRepository.createItem(item); + Assert.assertEquals(item, arrayListItemRepository.getById(42)); + } + + @Test + public void createItemTest2() { + Item item = new Item(0,"NewItem", 200, null); + arrayListItemRepository.createItem(item); + Assert.assertNotEquals(item, arrayListItemRepository.getById(42)); + Assert.assertEquals(item, arrayListItemRepository.getById(43)); + } + + @Test + public void addedTwoItemLinkedListTest() { + Item itemOne = new Item(0,"itemOne", 2000000001, null); + Item itemTwo = new Item(0,"itemTwo", 200, null); + Assert.assertTrue(linkedListItemRepository.createItem(itemOne)); + Assert.assertTrue(linkedListItemRepository.createItem(itemTwo)); + } + +} diff --git a/src/test/java/com/epam/edu/spring/core/template/LoadContextTest.java b/src/test/java/com/epam/edu/spring/core/template/LoadContextTest.java new file mode 100644 index 0000000..b577a46 --- /dev/null +++ b/src/test/java/com/epam/edu/spring/core/template/LoadContextTest.java @@ -0,0 +1,60 @@ +package com.epam.edu.spring.core.template; + +import com.epam.edu.spring.core.template.configuration.ColorFactory; +import com.epam.edu.spring.core.template.configuration.MainConfiguration; +import com.epam.edu.spring.core.template.repository.ArrayListItemRepository; +import com.epam.edu.spring.core.template.repository.LinkedListItemRepository; +import com.epam.edu.spring.core.template.service.SimpleItemService; +import com.epam.edu.spring.core.template.validator.ItemValidator; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes=MainConfiguration.class) +public class LoadContextTest { + + @Autowired + ApplicationContext ctx; + + @Test + public void itemValidatorCreateTest() { + ItemValidator itemValidator = ctx.getBean(ItemValidator.class); + Assert.assertNotNull(itemValidator); + } + + @Test + public void itemServiceConstructorCreateTest() { + SimpleItemService itemServiceConstructor = (SimpleItemService) ctx.getBean("itemServiceConstructor"); + Assert.assertNotNull(itemServiceConstructor); + } + + @Test + public void itemServiceSetterCreateTest() { + SimpleItemService itemServiceSetter = (SimpleItemService) ctx.getBean("itemServiceSetter"); + Assert.assertNotNull(itemServiceSetter); + } + + @Test + public void linkedListItemRepositoryCreateTest() { + LinkedListItemRepository linkedListItemRepository = ctx.getBean(LinkedListItemRepository.class); + Assert.assertNotNull(linkedListItemRepository); + } + + @Test + public void arrayListItemRepositoryCreateTest() { + ArrayListItemRepository arrayListItemRepository = ctx.getBean(ArrayListItemRepository.class); + Assert.assertNotNull(arrayListItemRepository); + } + + @Test + public void colorFactoryCreateTest() { + ColorFactory colorFactory = ctx.getBean(ColorFactory.class); + Assert.assertNotNull(colorFactory); + } + +}