diff --git a/pom.xml b/pom.xml index 541b54d..c5bac14 100644 --- a/pom.xml +++ b/pom.xml @@ -11,5 +11,25 @@ 1.8 1.8 + + + org.springframework + spring-context + 5.2.1.RELEASE + + + org.springframework + spring-test + 5.2.1.RELEASE + test + + + + junit + junit + 4.12 + 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..59ccf69 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,34 @@ 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.LinkedListItemRepository; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + + public class SpringCoreTemplate { public static void main(String[] args) { + System.out.println("hello word"); - } + AnnotationConfigApplicationContext context + = new AnnotationConfigApplicationContext(MainConfiguration.class); + + //ArrayListItemRepository a = (ArrayListItemRepository) context.getBean("itemRepository"); + LinkedListItemRepository l = (LinkedListItemRepository) context.getBean("itemRepository"); + + Item item = new Item(1, "Pasha", 20000000, Color.GREEN); + l.createItem(item); + Item pasha = l.getById(1); + System.out.println(pasha); + + Item item2 = new Item(2, "Masha", 10000000, Color.YELLOW); + + context.close(); + + } } 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..2f04270 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,20 @@ package com.epam.edu.spring.core.template.configuration; + +import com.epam.edu.spring.core.template.entity.ColorFactory; +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 { + + @Bean + @Lazy + @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..36fbc9a 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,43 @@ package com.epam.edu.spring.core.template.configuration; +import com.epam.edu.spring.core.template.repository.ItemRepository; +import com.epam.edu.spring.core.template.service.ItemService; +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.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.PropertySource; + +@PropertySource("application.properties") +@Import({RepositoryConfiguration.class, InitializerConfiguration.class}) public class MainConfiguration { + + @Value("${item.repository.implementation}") + String implementation; + + @Autowired + RepositoryConfiguration repositoryConfiguration; + @Autowired + InitializerConfiguration initializerConfiguration; + + @Bean + public ItemRepository itemRepository() { + if (implementation.equals("linked")) { + return repositoryConfiguration.linkedListItemRepository(); + } + return repositoryConfiguration.arrayListItemRepository(); + } + + @Bean + public ItemValidator itemValidator(){ + return new SimpleItemValidator(); + } + + @Bean + public ItemService itemService(){ + return new SimpleItemService(itemRepository(), itemValidator()); + } } 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..6f5f163 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,24 @@ 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.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.LinkedList; + +@Configuration public class RepositoryConfiguration { + + @Bean + public ItemRepository arrayListItemRepository() { + return new ArrayListItemRepository(new ArrayList<>()); + } + @Bean + public ItemRepository linkedListItemRepository() { + return new LinkedListItemRepository(new LinkedList<>()); + } + } 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..d8100ec 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,12 @@ package com.epam.edu.spring.core.template.entity; public enum Color { + RED, + BLUE, + GREEN, + BROWN, + YELLOW, + PINK; + } diff --git a/src/main/java/com/epam/edu/spring/core/template/entity/ColorFactory.java b/src/main/java/com/epam/edu/spring/core/template/entity/ColorFactory.java new file mode 100644 index 0000000..5044b1d --- /dev/null +++ b/src/main/java/com/epam/edu/spring/core/template/entity/ColorFactory.java @@ -0,0 +1,28 @@ +package com.epam.edu.spring.core.template.entity; + +import org.springframework.beans.factory.FactoryBean; +import java.util.Random; + + +public class ColorFactory implements FactoryBean { + + @Override + public Color getObject() throws Exception { + return Color.values()[new Random().nextInt(Color.values().length)]; + } + + @Override + public Class getObjectType() { + return ColorFactory.class; + } + + @Override + public boolean isSingleton() { + return false; + } + + public Color getColor(){ + return Color.values()[new Random().nextInt(Color.values().length)]; + } + +} 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..d2107c7 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 @@ -7,6 +7,7 @@ * ID сущности генерируется, исходя из initialSequence * @param */ + public abstract class AbstractRepository { protected long initialSequence = 0; @@ -15,6 +16,10 @@ public abstract class AbstractRepository { abstract void setInitialSequence(int val); + public long getInitialSequence() { + return initialSequence; + } + 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..d9e896d 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,41 @@ */ public class ArrayListItemRepository extends AbstractRepository implements ItemRepository { + // private final ArrayList listItem; + @Value("${initial.sequence}") + public long initialSequence; + + public ArrayListItemRepository(ArrayList listItem) { + this.holder = listItem; + } + @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; + for (Item itemInList : holder) { + if (itemInList.getId() == item.getId()) { + return false; + } + } + holder.add(item); + return true; } void setInitialSequence(int val) { - //TODO + this.initialSequence=val; } + 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..7c9b8ff 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,51 @@ 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 { + long initialSequence = new Random().nextInt(100); + + public LinkedListItemRepository(LinkedList listItem) { + this.holder = listItem; + } @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; + for (Item itemInList : holder) { + if (itemInList.getId() == item.getId()) { + return false; + } + } + holder.add(item); + return true; } void setInitialSequence(int val) { - //TODO + this.initialSequence = val; + } + + @Override + public long getInitialSequence() { + return initialSequence; } 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 index cb83f39..6a47c74 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 @@ -1,20 +1,37 @@ 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; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +@Component public class SimpleItemService implements ItemService { - private ItemService itemService; private ItemValidator itemValidator; + private ItemRepository repository; + + @Autowired + public SimpleItemService(ItemRepository repository, ItemValidator validator){ + this.repository=repository; + this.itemValidator=validator; + } + + @Autowired + public void setItemValidator(ItemValidator itemValidator) { + this.itemValidator = itemValidator; + } @Override public Item getById(long id) { - return null; + return repository.getById(id); } @Override public boolean createItem(Item item) { + if (itemValidator.isItemValid(item)) + return repository.createItem(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..df55d42 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 @@ -4,8 +4,10 @@ public class SimpleItemValidator implements ItemValidator { + //допустим нельзя создовать имена с пробелами + // и price имеет ограничения в 5 000 000 @Override public boolean isItemValid(Item item) { - return false; + return !item.getName().contains(" ") && !(item.getPrice() > 50000000); } } 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/test/java/com/epam/edu/spring/core/template/configuration/MainConfigurationTest.java b/src/test/java/com/epam/edu/spring/core/template/configuration/MainConfigurationTest.java new file mode 100644 index 0000000..af21d33 --- /dev/null +++ b/src/test/java/com/epam/edu/spring/core/template/configuration/MainConfigurationTest.java @@ -0,0 +1,39 @@ +package com.epam.edu.spring.core.template.configuration; + +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.LinkedListItemRepository; +import com.epam.edu.spring.core.template.service.SimpleItemService; +import junit.framework.TestCase; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.ContextConfiguration; + + + + +@ContextConfiguration(classes = MainConfiguration.class) +public class MainConfigurationTest extends TestCase { + AnnotationConfigApplicationContext context + = new AnnotationConfigApplicationContext(MainConfiguration.class); + + public void testItemRepository() { + LinkedListItemRepository l = (LinkedListItemRepository) context.getBean("itemRepository"); + assertTrue(l.getInitialSequence()>0 && l.getInitialSequence()<100); + } + + public void testItemService(){ + SimpleItemService s = (SimpleItemService) context.getBean("itemService"); + Item item1 = new Item(1, "Pasha", 20000000, Color.GREEN); + Item item2 = new Item(2, "Masha", 10000000, Color.BLUE); + Item item3 = new Item(3, "Dasha", 5000000, Color.YELLOW); + Item item4 = new Item(1, "Pasha", 20000000, Color.GREEN); + assertTrue(s.createItem(item1)); + assertTrue(s.createItem(item2)); + assertTrue(s.createItem(item3)); + assertFalse(s.createItem(item4)); + assertEquals(s.getById(2), item2); + assertEquals(s.getById(4), null); + System.out.println(s.getById(1)); + + } +} \ No newline at end of file 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..4302c20 --- /dev/null +++ b/src/test/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepositoryTest.java @@ -0,0 +1,36 @@ +package com.epam.edu.spring.core.template.repository; + +import com.epam.edu.spring.core.template.entity.Color; +import com.epam.edu.spring.core.template.entity.Item; +import junit.framework.TestCase; +import org.junit.Before; + +import java.util.ArrayList; + + +public class ArrayListItemRepositoryTest extends TestCase { + + ArrayListItemRepository l = new ArrayListItemRepository(new ArrayList<>()); + Item item = new Item(1, "Pasha", 20000000, Color.GREEN); + Item item2 = new Item(2, "Masha", 10000000, Color.YELLOW); + + @Before + public void setUp(){ + l.createItem(item); + l.createItem(item2); + } + + + public void testGetById() { + assertEquals(l.getById(1).getName(), "Pasha"); + assertEquals(l.getById(2).getColor(), Color.YELLOW); + } + + public void testCreateItem() { + Item item3 = new Item(2, "Sasha", 5000, Color.BLUE); + assertFalse(l.createItem(item3)); + + Item item4 = new Item(3, "Sasha", 5000, Color.BLUE); + assertTrue(l.createItem(item4)); + } +} \ No newline at end of file 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..3d96da1 --- /dev/null +++ b/src/test/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepositoryTest.java @@ -0,0 +1,35 @@ +package com.epam.edu.spring.core.template.repository; + +import com.epam.edu.spring.core.template.entity.Color; +import com.epam.edu.spring.core.template.entity.Item; +import junit.framework.TestCase; +import org.junit.Before; + +import java.util.LinkedList; + +public class LinkedListItemRepositoryTest extends TestCase { + + LinkedListItemRepository l = new LinkedListItemRepository(new LinkedList<>()); + Item item = new Item(1, "Pasha", 20000000, Color.GREEN); + Item item2 = new Item(2, "Masha", 10000000, Color.YELLOW); + + @Before + public void setUp(){ + l.createItem(item); + l.createItem(item2); + } + + + public void testGetById() { + assertEquals(l.getById(1).getName(), "Pasha"); + assertEquals(l.getById(2).getColor(), Color.YELLOW); + } + + public void testCreateItem() { + Item item3 = new Item(2, "Sasha", 5000, Color.BLUE); + assertFalse(l.createItem(item3)); + + Item item4 = new Item(3, "Sasha", 5000, Color.BLUE); + assertTrue(l.createItem(item4)); + } +} \ No newline at end of file diff --git a/src/test/java/com/epam/edu/spring/core/template/validator/SimpleItemValidatorTest.java b/src/test/java/com/epam/edu/spring/core/template/validator/SimpleItemValidatorTest.java new file mode 100644 index 0000000..17c029e --- /dev/null +++ b/src/test/java/com/epam/edu/spring/core/template/validator/SimpleItemValidatorTest.java @@ -0,0 +1,18 @@ +package com.epam.edu.spring.core.template.validator; + +import com.epam.edu.spring.core.template.entity.Color; +import com.epam.edu.spring.core.template.entity.Item; +import junit.framework.TestCase; + +public class SimpleItemValidatorTest extends TestCase { + + public void testIsItemValid() { + SimpleItemValidator s = new SimpleItemValidator(); + Item item = new Item(1, "Pasha", 20000000, Color.GREEN); + assertTrue(s.isItemValid(item)); + Item item2 = new Item(1, "Pasha", 60000000, Color.GREEN); + assertFalse(s.isItemValid(item2)); + Item item3 = new Item(1, "Pasha Ogorodnikov", 20000000, Color.GREEN); + assertFalse(s.isItemValid(item3)); + } +} \ No newline at end of file diff --git a/src/test/resources/testAplication.properties b/src/test/resources/testAplication.properties new file mode 100644 index 0000000..864c68f --- /dev/null +++ b/src/test/resources/testAplication.properties @@ -0,0 +1,2 @@ +initial.sequence=42 +item.repository.implementation=linked \ No newline at end of file