diff --git a/pom.xml b/pom.xml index 541b54d..0a71bdb 100644 --- a/pom.xml +++ b/pom.xml @@ -10,6 +10,60 @@ 1.8 1.8 + 5.2.1.RELEASE + 5.5.2 + + + org.springframework + spring-context + ${spring.version} + + + + javax.annotation + javax.annotation-api + 1.3.2 + + + + + org.springframework + spring-test + ${spring.version} + test + + + + + org.assertj + assertj-core + 3.22.0 + test + + + + org.springframework.boot + spring-boot-starter-test + 2.1.1.RELEASE + test + + + + org.junit.jupiter + junit-jupiter-params + ${junit.jupiter.version} + test + + + + org.springframework.boot + spring-boot-autoconfigure + 2.1.1.RELEASE + compile + + + + diff --git a/src/main/java/com/epam/edu/spring/core/template/service/ItemService.java b/src/main/java/com/epam/edu/spring/core/template/ItemService.java similarity index 75% rename from src/main/java/com/epam/edu/spring/core/template/service/ItemService.java rename to src/main/java/com/epam/edu/spring/core/template/ItemService.java index fb664a0..2db48be 100644 --- a/src/main/java/com/epam/edu/spring/core/template/service/ItemService.java +++ b/src/main/java/com/epam/edu/spring/core/template/ItemService.java @@ -1,4 +1,4 @@ -package com.epam.edu.spring.core.template.service; +package com.epam.edu.spring.core.template; import com.epam.edu.spring.core.template.entity.Item; diff --git a/src/main/java/com/epam/edu/spring/core/template/SimpleItemService.java b/src/main/java/com/epam/edu/spring/core/template/SimpleItemService.java new file mode 100644 index 0000000..2df67d6 --- /dev/null +++ b/src/main/java/com/epam/edu/spring/core/template/SimpleItemService.java @@ -0,0 +1,43 @@ +package com.epam.edu.spring.core.template; + +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; + +public class SimpleItemService implements ItemService { + + private ItemRepository itemRepository; + private ItemValidator itemValidator; + @Autowired + public SimpleItemService(ItemRepository itemRepository, ItemValidator itemValidator) { + this.itemRepository = itemRepository; + this.itemValidator = itemValidator; + } + + + public void setItemValidator(ItemValidator itemValidator) { + this.itemValidator = itemValidator; + } + + public SimpleItemService(ItemRepository itemRepository) { + this.itemRepository = itemRepository; + } + + public void setItemRepository(ItemRepository itemRepository) { + this.itemRepository = itemRepository; + } + + @Override + public Item getById(long id) { + return itemRepository.getById(id); + } + + @Override + public boolean createItem(Item item) { + if(itemValidator.isItemValid(item)) { + return itemRepository.createItem(item); + } + return false; + } +} 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..30d593c 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,28 @@ package com.epam.edu.spring.core.template; +import com.epam.edu.spring.core.template.configuration.InitializerConfiguration; +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.factory.ColorFactory; +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) { + public static void main(String[] args) { + ApplicationContext context = new AnnotationConfigApplicationContext(MainConfiguration.class); + + ColorFactory colorFactory = context.getBean(ColorFactory.class); + System.out.println(colorFactory.getColor()); + SimpleItemService simpleItemService = context.getBean(SimpleItemService.class); + simpleItemService.createItem(new Item(1, "itemOne", 22, colorFactory.getColor())); + System.out.println(simpleItemService.getById(1)); + + for (String beanName : context.getBeanDefinitionNames()) { + System.out.println(beanName); + } } } 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..aeef530 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.factory.ColorFactory; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.*; + + + +@ComponentScan public class InitializerConfiguration { + + @Bean + @Lazy + @Scope(BeanDefinition.SCOPE_PROTOTYPE) + public ColorFactory colorFactory(){ + return new ColorFactory(); + } + } 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..4be49c9 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,8 @@ package com.epam.edu.spring.core.template.configuration; +import org.springframework.context.annotation.Import; + +@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..d03b7a7 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,44 @@ 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 com.epam.edu.spring.core.template.ItemService; +import com.epam.edu.spring.core.template.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.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 implementation; + + @Bean + public ItemRepository itemRepository() { + return implementation.equals("array") ? arrayListItemRepository() : linkedListItemRepository(); + } + @Bean + public ArrayListItemRepository arrayListItemRepository() { + return new ArrayListItemRepository(); +} + @Bean + public LinkedListItemRepository linkedListItemRepository() { + return new LinkedListItemRepository(); +} + @Bean + public ItemService itemService() { + return new SimpleItemService(itemRepository(), itemValidator()); + } + @Bean + public ItemValidator itemValidator() { + return new SimpleItemValidator(); + } } 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..9251fa3 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,6 @@ package com.epam.edu.spring.core.template.entity; public enum Color { + YELLOW, BLUE, RED, ORANGE, WHITE, BLACK } 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/factory/ColorFactory.java b/src/main/java/com/epam/edu/spring/core/template/factory/ColorFactory.java new file mode 100644 index 0000000..351f4c4 --- /dev/null +++ b/src/main/java/com/epam/edu/spring/core/template/factory/ColorFactory.java @@ -0,0 +1,30 @@ +package com.epam.edu.spring.core.template.factory; + +import com.epam.edu.spring.core.template.entity.Color; +import org.springframework.beans.factory.FactoryBean; + +import java.util.Random; + + +public class ColorFactory implements FactoryBean { + + @Override + public Color getObject() { + Color[] colors = Color.values(); + return colors[new Random().nextInt(colors.length)]; + } + + @Override + public Class getObjectType() { + return Color.class; + } + + public Color getColor() { + return getObject(); + } + + @Override + public boolean isSingleton() { + return false; + } +} 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..cf4e200 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.stereotype.Repository; + +import javax.annotation.PostConstruct; +import java.util.ArrayList; /** * Репозиторий, основанный на классе ArrayList. * initialSequence должен браться из application.properties */ +@Repository public class ArrayListItemRepository extends AbstractRepository implements ItemRepository { + @Override public Item getById(long id) { + if(!holder.isEmpty()) { + for(Item item : holder) { + if(item.getId() == id) { + return item; + } + } + } return null; } @Override public boolean createItem(Item item) { - return false; - } + if(!(holder.isEmpty())) { + for (Item el : holder) { + if (el.getId() == item.getId()) { + return false; + } + } + } + holder.add(item); + return true; + } + + @Value("${initial.sequence}") void setInitialSequence(int val) { - //TODO + initialSequence = val; } - + @PostConstruct void setHolder() { - //TODO + this.holder = new ArrayList<>(); } } 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..9e8ab25 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,47 @@ 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.stereotype.Repository; +import javax.annotation.PostConstruct; +import java.util.LinkedList; + /** * Репозиторий, основанный на классе LinkedList. * initialSequence должен случайно генерироваться из диапазона от 1 до 100 */ +@Repository public class LinkedListItemRepository extends AbstractRepository implements ItemRepository { @Override public Item getById(long id) { + for(Item item : holder) { + if(item.getId() == id) { + return item; + } + } return null; } - @Override public boolean createItem(Item item) { - return false; + if(!holder.isEmpty()) { + for(Item createItem : holder) { + if(createItem.getId() == item.getId()) { + return false; + } + } + } + holder.add(item); + return true; } - - void setInitialSequence(int val) { - //TODO + @Value(value = "#{ T(java.lang.Math).random() * 100 + 1 }") + public void setInitialSequence(int val) { + this.initialSequence = val; } + @PostConstruct void setHolder() { - //TODO + this.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 deleted file mode 100644 index 802d512..0000000 --- a/src/main/java/com/epam/edu/spring/core/template/service/SimpleItemService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.epam.edu.spring.core.template.service; - -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; - -public class SimpleItemService implements ItemService { - - private ItemRepository itemRepository; - private ItemValidator itemValidator; - - @Override - public Item getById(long id) { - return null; - } - - @Override - public boolean createItem(Item item) { - return false; - } -} 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..ca638f4 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,31 @@ public class SimpleItemValidator implements ItemValidator { @Override public boolean isItemValid(Item item) { - return false; + return isIdValid(item)&&isPriceValid(item)&&isNameValid(item); + } + + private boolean isIdValid(Item item) { + if (item.getId() < 0) { + System.err.println("id must be positive"); + return false; + } + return true; + } + + private boolean isPriceValid(Item item) { + if (item.getPrice() < 0) { + System.err.println("Price must be positive."); + return false; + } + return true; + } + + private boolean isNameValid(Item item) { + String itemName = item.getName(); + if (itemName == null || itemName.isEmpty()) { + System.err.println("name is empty."); + return false; + } + return true; } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 69c2e92..a1a2d25 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=array diff --git a/src/test/java/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java b/src/test/java/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java new file mode 100644 index 0000000..ce276a0 --- /dev/null +++ b/src/test/java/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java @@ -0,0 +1,23 @@ +package com.epam.edu.spring.core.template; + + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest(classes = SpringCoreTemplate.class) +public class SpringCoreTemplateTest { + @Autowired + ApplicationContext applicationContext; + + @Test + @DisplayName("context loading") + public void contextLoads() { + assertThat(applicationContext).isNotNull(); + } + + } + diff --git a/src/test/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepositoryTest.java b/src/test/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepositoryTest.java new file mode 100644 index 0000000..b4edd21 --- /dev/null +++ b/src/test/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepositoryTest.java @@ -0,0 +1,54 @@ +package com.epam.edu.spring.core.template.repository; + +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 org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = MainConfiguration.class) +public class ArrayListItemRepositoryTest { + + @Autowired + ArrayListItemRepository arrayListItemRepository; + + public static Item itemOne; + public static Item itemTwo; + + @BeforeEach + public void createObjectOneTwo() { + itemOne = new Item(154, "ObjectOne", 8.15, Color.BLACK); + itemTwo = new Item(155, "ObjectTwo", 15.02, Color.WHITE); + arrayListItemRepository.setHolder(); + } + + @Test + @DisplayName("test method setHolder()") + void testSetHolder() { + Assertions.assertNotNull(arrayListItemRepository.holder); + } + @Test + @DisplayName("test method getById(long id)") + void testGetById() { + arrayListItemRepository.createItem(itemOne); + Assertions.assertEquals(arrayListItemRepository.getById(154), itemOne); + } + @Test + @DisplayName("test method createItem(Item item)") + void testCreateItem() { + Assertions.assertTrue(arrayListItemRepository.createItem(itemTwo)); + } + @Test + @DisplayName("test method setInitialSequence(int val) ") + void testSetInitialSequence() { + Assertions.assertNotEquals(0, arrayListItemRepository.initialSequence); + } + +} diff --git a/src/test/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepositoryTest.java b/src/test/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepositoryTest.java new file mode 100644 index 0000000..68f9ffd --- /dev/null +++ b/src/test/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepositoryTest.java @@ -0,0 +1,54 @@ +package com.epam.edu.spring.core.template.repository; + +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 org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = MainConfiguration.class) +public class LinkedListItemRepositoryTest { + + private static Item itemOne; + private static Item itemTwo; + + + @Autowired + LinkedListItemRepository linkedListItemRepository; + + @BeforeEach + private void createObjectOneTwo() { + itemOne = new Item(254, "test item 1", 12.32, Color.ORANGE); + itemTwo = new Item(255, "test item 2", 25.61, Color.YELLOW); + linkedListItemRepository.setHolder(); + } + @Test + @DisplayName("test method setHolder()") + void testSetHolder() { + Assertions.assertNotNull(linkedListItemRepository.holder); + } + @Test + @DisplayName("test method setInitialSequence(int val) ") + void testSetInitialSequence() { + Assertions.assertNotEquals(0, linkedListItemRepository.initialSequence); + } + @Test + @DisplayName("test method getById(long id)") + void testGetById() { + linkedListItemRepository.createItem(itemOne); + Assertions.assertEquals(linkedListItemRepository.getById(254), itemOne); + } + @Test + @DisplayName("test method createItem(Item item)") + void testCreateItem() { + Assertions.assertTrue(linkedListItemRepository.createItem(itemTwo)); + } + +} diff --git a/src/test/java/com/epam/edu/spring/core/template/service/SimpleItemServiceTest.java b/src/test/java/com/epam/edu/spring/core/template/service/SimpleItemServiceTest.java new file mode 100644 index 0000000..10679ef --- /dev/null +++ b/src/test/java/com/epam/edu/spring/core/template/service/SimpleItemServiceTest.java @@ -0,0 +1,54 @@ +package com.epam.edu.spring.core.template.service; + + +import com.epam.edu.spring.core.template.ItemService; +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 org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = MainConfiguration.class) +public class SimpleItemServiceTest { + public static Item itemOne; + public static Item itemTwo; + public static Item itemThree; + + @Autowired + ItemService itemService; + + @BeforeEach + private void createObjectOneTwo() { + itemOne = new Item(554, "itemOne", 222.22, Color.WHITE); + itemTwo = new Item(82, "itemTwo", 17.56, Color.BLACK); + itemThree = new Item(81, "itemThree", 18.00, Color.ORANGE); + + } + @Test + @DisplayName("test method getById(long id)") + void testGetById() { + itemService.createItem(itemOne); + Assertions.assertEquals(itemService.getById(554), itemOne); + } + + @Test + @DisplayName("test method createItem(Item item)") + void testCreateItem() { + Assertions.assertTrue(itemService.createItem(itemTwo)); + } + + @Test + @DisplayName("test method createItem(Item item)") + void itemCouldNotBeCreated() { + itemService.createItem(itemThree); + Assertions.assertFalse(itemService.createItem(itemThree)); + } + +}