From a7ef30768aca77497faf2bc52107cc7ddc4eb703 Mon Sep 17 00:00:00 2001 From: Mesnyankin Vladislav Date: Wed, 12 Jan 2022 16:57:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F=20"=D0=9E=D1=81=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=20=D1=84=D1=80=D0=B5=D0=B9=D0=BC=D0=B2=D0=BE?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20Spring"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 32 ++++++ .../core/template/SpringCoreTemplate.java | 25 ++++- .../InitializerConfiguration.java | 18 ++++ .../configuration/MainConfiguration.java | 6 ++ .../RepositoryConfiguration.java | 32 ++++++ .../spring/core/template/entity/Color.java | 2 +- .../edu/spring/core/template/entity/Item.java | 10 ++ .../repository/AbstractRepository.java | 1 + .../repository/ArrayListItemRepository.java | 26 ++++- .../template/repository/ItemRepository.java | 2 + .../repository/LinkedListItemRepository.java | 22 ++++- .../template/service/SimpleItemService.java | 18 +++- .../validator/SimpleItemValidator.java | 2 +- src/main/resources/application.properties | 2 +- .../core/template/SpringCoreTemplateTest.java | 99 +++++++++++++++++++ 15 files changed, 284 insertions(+), 13 deletions(-) create mode 100644 src/main/tests/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java diff --git a/pom.xml b/pom.xml index 541b54d..989fafb 100644 --- a/pom.xml +++ b/pom.xml @@ -12,4 +12,36 @@ 1.8 + + + + org.springframework + spring-context + 5.2.1.RELEASE + + + + org.springframework + spring-test + 5.2.1.RELEASE + test + + + + junit + junit + 4.13 + test + + + + org.hamcrest + hamcrest-all + 1.3 + test + + + + + 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..f819df2 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,30 @@ package com.epam.edu.spring.core.template; +import com.epam.edu.spring.core.template.configuration.MainConfiguration; +import com.epam.edu.spring.core.template.entity.Color; +import com.epam.edu.spring.core.template.entity.Item; +import com.epam.edu.spring.core.template.repository.ItemRepository; +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) { + ApplicationContext context = + new AnnotationConfigApplicationContext(MainConfiguration.class); + + ItemRepository itemService = context.getBean("itemRepository", ItemRepository.class); + + Item item1 = new Item(1, "Car", 100, context.getBean("colorFactory", Color.class)); + Item item2 = new Item(2, "Bus", 200, context.getBean("colorFactory", Color.class)); + Item item3 = new Item(3, "Airplane", 2000, context.getBean("colorFactory", Color.class)); - } + itemService.createItem(item1); + itemService.createItem(item2); + itemService.createItem(item3); + System.out.println(itemService.getById(1) + " initialSequence: " + itemService.getInitialSequence()); + System.out.println(itemService.getById(2) + " initialSequence: " + itemService.getInitialSequence()); + System.out.println(itemService.getById(3) + " initialSequence: " + itemService.getInitialSequence()); + } } 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..416703b 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,22 @@ package com.epam.edu.spring.core.template.configuration; +import com.epam.edu.spring.core.template.entity.Color; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import org.springframework.context.annotation.Scope; + +import java.util.Random; + +@Configuration public class InitializerConfiguration { + + @Bean + @Scope("prototype") + @Lazy + public Color colorFactory() { + return Color.values()[new Random().nextInt(Color.values().length)]; + } + + } 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..bb548cd 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,10 @@ package com.epam.edu.spring.core.template.configuration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@Import({InitializerConfiguration.class, RepositoryConfiguration.class}) public class MainConfiguration { + } 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..0e66371 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,36 @@ 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; +import org.springframework.context.annotation.PropertySource; + +@Configuration +@PropertySource("classpath:application.properties") public class RepositoryConfiguration { + + @Value("${item.repository.implementation}") + String itemRepositoryImplementationType; + + @Bean + public ArrayListItemRepository arrayListItemRepository() { + return new ArrayListItemRepository(); + } + + @Bean + public LinkedListItemRepository linkedListItemRepository() { + return new LinkedListItemRepository(); + } + + @Bean + public ItemRepository itemRepository() { + if (itemRepositoryImplementationType.equals("linked")) { + return linkedListItemRepository(); + } else { + return arrayListItemRepository(); + } + } } diff --git a/src/main/java/com/epam/edu/spring/core/template/entity/Color.java b/src/main/java/com/epam/edu/spring/core/template/entity/Color.java index f5fe91d..46c6e7b 100644 --- a/src/main/java/com/epam/edu/spring/core/template/entity/Color.java +++ b/src/main/java/com/epam/edu/spring/core/template/entity/Color.java @@ -1,5 +1,5 @@ package com.epam.edu.spring.core.template.entity; public enum Color { - + Red, Orange, Green, Blue, Indigo, Violet } 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..246b5f0 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,14 @@ public Color getColor() { public void setColor(Color color) { this.color = color; } + + @Override + public String toString() { + return "Item{" + + "id=" + id + + ", name='" + name + '\'' + + ", price=" + price + + ", color=" + color + + '}'; + } } diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/AbstractRepository.java b/src/main/java/com/epam/edu/spring/core/template/repository/AbstractRepository.java index 494e526..951b284 100644 --- a/src/main/java/com/epam/edu/spring/core/template/repository/AbstractRepository.java +++ b/src/main/java/com/epam/edu/spring/core/template/repository/AbstractRepository.java @@ -5,6 +5,7 @@ /** * Абстрактный класс для хранения сущностей. * ID сущности генерируется, исходя из initialSequence + * * @param */ public abstract class AbstractRepository { 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..9f03d0b 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,6 +1,9 @@ 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 java.util.ArrayList; /** * Репозиторий, основанный на классе ArrayList. @@ -8,21 +11,38 @@ */ public class ArrayListItemRepository extends AbstractRepository implements ItemRepository { + private final ArrayList itemArrayList = new ArrayList<>(); + + @Value("${initial.sequence}") + private long initialSequence = super.initialSequence; + + @Override public Item getById(long id) { + for (Item item : itemArrayList) { + if (item.getId() == id) { + return item; + } + } return null; } @Override public boolean createItem(Item item) { - return false; + return itemArrayList.add(item); } + void setInitialSequence(int val) { - //TODO + this.initialSequence = val; } void setHolder() { - //TODO + holder = itemArrayList; + } + + public long getInitialSequence() { + return initialSequence; } + } diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/ItemRepository.java b/src/main/java/com/epam/edu/spring/core/template/repository/ItemRepository.java index 27cf445..d471fb1 100644 --- a/src/main/java/com/epam/edu/spring/core/template/repository/ItemRepository.java +++ b/src/main/java/com/epam/edu/spring/core/template/repository/ItemRepository.java @@ -8,4 +8,6 @@ public interface ItemRepository { boolean createItem(Item item); + long getInitialSequence(); + } 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..1a6d168 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 @@ -2,27 +2,43 @@ import com.epam.edu.spring.core.template.entity.Item; +import java.util.LinkedList; +import java.util.Random; + /** * Репозиторий, основанный на классе LinkedList. * initialSequence должен случайно генерироваться из диапазона от 1 до 100 */ public class LinkedListItemRepository extends AbstractRepository implements ItemRepository { + private final LinkedList itemLinkedList = new LinkedList<>(); + + private long initialSequence = new Random().nextLong(); + @Override public Item getById(long id) { + for (Item item : itemLinkedList) { + if (item.getId() == id) { + return item; + } + } return null; } @Override public boolean createItem(Item item) { - return false; + return itemLinkedList.add(item); } void setInitialSequence(int val) { - //TODO + initialSequence = val; } void setHolder() { - //TODO + holder = this.itemLinkedList; + } + + public long getInitialSequence() { + return initialSequence; } } 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..084bfe3 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 @@ -6,16 +6,30 @@ public class SimpleItemService implements ItemService { + private ItemRepository itemRepository; private ItemValidator itemValidator; + public SimpleItemService(ItemRepository itemRepository, ItemValidator itemValidator) { + this.itemRepository = itemRepository; + this.itemValidator = itemValidator; + } + + public void setItemRepository(ItemRepository itemRepository) { + this.itemRepository = itemRepository; + } + + public void setItemValidator(ItemValidator itemValidator) { + this.itemValidator = itemValidator; + } + @Override public Item getById(long id) { - return null; + return itemRepository.getById(id); } @Override public boolean createItem(Item item) { - return false; + return itemValidator.isItemValid(item) && itemRepository.createItem(item); } } 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..ae950c6 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,6 @@ public class SimpleItemValidator implements ItemValidator { @Override public boolean isItemValid(Item item) { - return false; + return item != null; } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 69c2e92..864c68f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,2 +1,2 @@ initial.sequence=42 -item.repository.implementation= \ No newline at end of file +item.repository.implementation=linked \ No newline at end of file diff --git a/src/main/tests/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java b/src/main/tests/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java new file mode 100644 index 0000000..d3d20e6 --- /dev/null +++ b/src/main/tests/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java @@ -0,0 +1,99 @@ +package com.epam.edu.spring.core.template; + +import com.epam.edu.spring.core.template.configuration.MainConfiguration; +import com.epam.edu.spring.core.template.entity.Color; +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.ItemRepository; +import com.epam.edu.spring.core.template.repository.LinkedListItemRepository; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.Assert.*; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = MainConfiguration.class) +public class SpringCoreTemplateTest { + + @Value("${initial.sequence}") + int itemRepositoryImplementation; + + @Value("${item.repository.implementation}") + String repositoryImplementation; + + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfiguration.class); + Item item1 = new Item(1, "item1", 10.2, Color.Indigo); + Item item2 = new Item(2, "item2", 15.2, Color.Blue); + Item item3 = new Item(3, "item3", 0.2, Color.Orange); + + @Test + public void contextNotNullTest() { + assertNotNull(context); + } + + @Test + public void colorFactoryTest() { + assertNotNull(context.getBean("colorFactory", Color.class)); + } + + @Test + public void arrayListItemRepository_BeanCreatedTest() { + assertNotNull(context.getBean("arrayListItemRepository", ItemRepository.class)); + } + + @Test + public void linkedListItemRepository_BeanCreatedTest() { + assertNotNull(context.getBean("linkedListItemRepository", ItemRepository.class)); + } + + @Test + public void itemRepository_BeanCreatedTest() { + assertNotNull(context.getBean("itemRepository", ItemRepository.class)); + } + + @Test + public void itemRepository_addtoList() { + ItemRepository itemService = context.getBean("itemRepository", ItemRepository.class); + + itemService.createItem(item1); + itemService.createItem(item2); + itemService.createItem(item3); + + assertEquals(itemService.getById(1), item1); + } + + @Test + public void createItem_Test() { + ItemRepository itemService = context.getBean("itemRepository", ItemRepository.class); + assertTrue(itemService.createItem(item1)); + } + + + @Test + public void readProp_Test() { + ItemRepository itemRepository = context.getBean("arrayListItemRepository", ItemRepository.class); + + if (itemRepository instanceof ArrayListItemRepository) { + assertEquals(itemRepository.getInitialSequence(), itemRepositoryImplementation); + } else { + assertNotEquals(itemRepository.getInitialSequence(), itemRepositoryImplementation); + } + } + + @Test + public void readPropRepositoryImpl_Test() { + ItemRepository itemRepository = context.getBean("itemRepository", ItemRepository.class); + + if (repositoryImplementation.equals("linked")) { + assertTrue(itemRepository instanceof LinkedListItemRepository); + } else { + assertTrue(itemRepository instanceof ArrayListItemRepository); + } + } + + +} \ No newline at end of file