diff --git a/pom.xml b/pom.xml index 541b54d..457a90f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,10 +6,34 @@ com.epam.edu spring-core-template 0.0.1-SNAPSHOT + + + org.springframework + spring-context + 5.2.1.RELEASE + + + org.springframework + spring-context-support + 5.2.1.RELEASE + + + org.springframework + spring-test + 5.2.1.RELEASE + + + junit + junit + 4.13 + 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..6b76f3c 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,8 +1,22 @@ package com.epam.edu.spring.core.template; +import com.epam.edu.spring.core.template.configuration.MainConfiguration; + + +import com.epam.edu.spring.core.template.validator.SimpleItemValidator; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + + public class SpringCoreTemplate { + + public static void main(String[] args) { + AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfiguration.class); + ApplicationContext applicationContext = annotationConfigApplicationContext; + applicationContext.getBean(SimpleItemValidator.class); + } 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..02972d0 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,19 @@ package com.epam.edu.spring.core.template.configuration; + +import com.epam.edu.spring.core.template.entity.FactoryColor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import org.springframework.context.annotation.Scope; + +@Configuration public class InitializerConfiguration { + @Lazy + @Bean + @Scope("prototype") + public FactoryColor factoryColor() { + return new FactoryColor(); + } } + 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..660b972 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,11 @@ package com.epam.edu.spring.core.template.configuration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@ComponentScan("com.epam.edu.spring.core.template") +@Import({RepositoryConfiguration.class, InitializerConfiguration.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..d506695 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,41 @@ 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; + + +import java.util.ArrayList; +import java.util.LinkedList; + +@Configuration +@PropertySource(value = "classpath:application.properties") public class RepositoryConfiguration { + @Value(value = "${item.repository.implementation}") + String implementationType; + + @Bean + public ItemRepository itemRepository() { + if (implementationType.equals("linked")) { + return linkedListItemRepository(); + } else { + return arrayListItemRepository(); + } + } + + @Bean + public LinkedListItemRepository linkedListItemRepository() { + return new LinkedListItemRepository(new LinkedList<>()); + } + + @Bean + public ArrayListItemRepository arrayListItemRepository() { + return new ArrayListItemRepository(new ArrayList<>()); + } } + 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..e74347f 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,13 @@ package com.epam.edu.spring.core.template.entity; public enum Color { - + YELLOW, + GREEN, + BLACK, + WHITE, + RED, + ORANGE, + BLUE, + BROWN, + PINK } diff --git a/src/main/java/com/epam/edu/spring/core/template/entity/FactoryColor.java b/src/main/java/com/epam/edu/spring/core/template/entity/FactoryColor.java new file mode 100644 index 0000000..3eca633 --- /dev/null +++ b/src/main/java/com/epam/edu/spring/core/template/entity/FactoryColor.java @@ -0,0 +1,29 @@ +package com.epam.edu.spring.core.template.entity; + +import org.springframework.beans.factory.FactoryBean; +import org.springframework.stereotype.Component; + +import java.util.Random; + +@Component +public class FactoryColor implements FactoryBean { + public Color getColor() throws Exception { + return getObject(); + } + + + @Override + public Color getObject() { + return Color.values()[new Random().nextInt(Color.values().length)]; + } + + @Override + public Class getObjectType() { + return Color.class; + } + + @Override + public boolean isSingleton() { + return false; + } +} 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..f93968a 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 @@ -17,4 +17,5 @@ public abstract class AbstractRepository { abstract void setHolder(); + } 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..e6a1645 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,52 @@ 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 java.util.ArrayList; /** * Репозиторий, основанный на классе ArrayList. * initialSequence должен браться из application.properties */ + +@PropertySource(value = "classpath:application.properties") public class ArrayListItemRepository extends AbstractRepository implements ItemRepository { + public ArrayListItemRepository(ArrayList itemArrayList) { + this.itemArrayList = itemArrayList; + } + + private ArrayList itemArrayList; + + + private int initialSequence; @Override public Item getById(long id) { + for (Item i : itemArrayList) { + if (i.getId() == id) { + return i; + } + } return null; } @Override public boolean createItem(Item item) { - return false; + return itemArrayList.add(item); } + @Override + @Value(value = "${initial.sequence}") void setInitialSequence(int val) { - //TODO + this.initialSequence = val; } + + @Override void setHolder() { - //TODO + holder = this.itemArrayList; } -} + +} \ No newline at end of file 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..4a914cd 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,46 @@ 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 { + public LinkedListItemRepository(LinkedList itemLinkedList) { + this.itemLinkedList = itemLinkedList; + } + + private LinkedList itemLinkedList; + int initialSequence; + @Override public Item getById(long id) { + for (Item i : itemLinkedList) { + if (i.getId() == id) { + return i; + } + } return null; } @Override public boolean createItem(Item item) { - return false; + return itemLinkedList.add(item); } - void setInitialSequence(int val) { - //TODO + + public void setInitialSequence(int val) { + Random random = new Random(val); + this.initialSequence = random.nextInt(100); } + void setHolder() { - //TODO + holder = this.itemLinkedList; } } 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..d7b2aef 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 @@ -3,19 +3,46 @@ import com.epam.edu.spring.core.template.entity.Item; import com.epam.edu.spring.core.template.repository.ItemRepository; import com.epam.edu.spring.core.template.validator.ItemValidator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component public class SimpleItemService implements ItemService { private ItemRepository itemRepository; + private ItemValidator itemValidator; + @Autowired + public SimpleItemService(ItemRepository itemRepository, ItemValidator itemValidator) { + this.itemRepository = itemRepository; + this.itemValidator = itemValidator; + } + + @Autowired + public void setItemRepository(ItemRepository itemRepository) { + this.itemRepository = itemRepository; + } + + @Autowired + public void setItemValidator(ItemValidator itemValidator) { + this.itemValidator = itemValidator; + } + + @Override - public Item getById(long id) { - return null; + public Item getById(long id) {return itemRepository.getById(id); + } + + public ItemRepository getItemRepository() { + return itemRepository; } @Override public boolean createItem(Item item) { - return false; + return 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..e67952f 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 @@ -1,11 +1,13 @@ package com.epam.edu.spring.core.template.validator; import com.epam.edu.spring.core.template.entity.Item; +import org.springframework.stereotype.Component; +@Component public class SimpleItemValidator implements ItemValidator { @Override public boolean isItemValid(Item item) { - return false; + return item != null; } } diff --git a/src/test/java/template/TestApplication.java b/src/test/java/template/TestApplication.java new file mode 100644 index 0000000..2eaa7b9 --- /dev/null +++ b/src/test/java/template/TestApplication.java @@ -0,0 +1,70 @@ +package 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.FactoryColor; +import com.epam.edu.spring.core.template.entity.Item; +import com.epam.edu.spring.core.template.repository.AbstractRepository; +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.SimpleItemValidator; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.lang.reflect.Field; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = MainConfiguration.class) + +public class TestApplication { + AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfiguration.class); + Item itemTest = new Item(1, "ItemTest", 16.5, Color.BLACK); + + @Test + public void testFactoryColor() throws Exception { + Assert.assertNotNull("Color не создался", annotationConfigApplicationContext.getBean(FactoryColor.class).getColor()); + Assert.assertNotSame("Color не является цветом", annotationConfigApplicationContext.getBean(FactoryColor.class).getColor().getClass(), Enum.class); + } + + @Test + public void testArrayListItemRepository() throws Exception { + ArrayListItemRepository arrayListItemRepositoryTest = (ArrayListItemRepository) annotationConfigApplicationContext.getBean("arrayListItemRepository"); + Assert.assertTrue("Объект не добавлен в ArrayListItemRepository", arrayListItemRepositoryTest.createItem(itemTest)); + Assert.assertEquals("Объект не существует или не найден в ArrayListItemRepository", arrayListItemRepositoryTest.getById(1), itemTest); + Field initialSequence = arrayListItemRepositoryTest.getClass().getDeclaredField("initialSequence"); + initialSequence.setAccessible(true); + int initialSequenceValue = (int) initialSequence.get(arrayListItemRepositoryTest); + Assert.assertEquals("InitialSequence не считывается из проперти", 42, initialSequenceValue); + } + + @Test + public void testLinkedListItemRepository() throws Exception { + LinkedListItemRepository linkedListItemRepositoryTest = (LinkedListItemRepository) annotationConfigApplicationContext.getBean("linkedListItemRepository"); + Assert.assertTrue("объект не добавлен в LinkedListItemRepository", linkedListItemRepositoryTest.createItem(itemTest)); + Assert.assertEquals("Объект не существует или не найден в LinkedListItemRepository", linkedListItemRepositoryTest.getById(1), itemTest); + linkedListItemRepositoryTest.setInitialSequence(15); + Field initialSequence = linkedListItemRepositoryTest.getClass().getDeclaredField("initialSequence"); + initialSequence.setAccessible(true); + int initialSequenceValue = (int) initialSequence.get(linkedListItemRepositoryTest); + Assert.assertTrue("InitialSequence превосходит допустимое значение", initialSequenceValue <= 100); + } + + @Test + public void testSimpleItemsService() { + SimpleItemService service = annotationConfigApplicationContext.getBean(SimpleItemService.class); + Assert.assertTrue("Объект не создан", service.createItem(itemTest)); + Assert.assertEquals("У вас не правильно выбирается ItemRepository исходя из проперти", ArrayListItemRepository.class, service.getItemRepository().getClass()); + Assert.assertEquals("Объект не существует или не найден в ItemRepository", service.getById(1), itemTest); + } + + @Test + public void testSimpleItemValidator() { + SimpleItemValidator simpleItemValidator = annotationConfigApplicationContext.getBean(SimpleItemValidator.class); + Assert.assertTrue("Объекта не существует", simpleItemValidator.isItemValid(itemTest)); + } +} diff --git a/src/test/resources/test.properties b/src/test/resources/test.properties new file mode 100644 index 0000000..f219f99 --- /dev/null +++ b/src/test/resources/test.properties @@ -0,0 +1,2 @@ +initial.sequence=42 +item.repository.implementation=array \ No newline at end of file