diff --git a/pom.xml b/pom.xml index 541b54d..b164557 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,13 @@ com.epam.edu spring-core-template 0.0.1-SNAPSHOT - + + + org.springframework + spring-context + 5.2.1.RELEASE + + 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..299b8aa 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,24 @@ package com.epam.edu.spring.core.template; -public class SpringCoreTemplate { +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.ItemRepository; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; - public static void main(String[] args) { +public class SpringCoreTemplate { - } + public static void main(String[] args) { + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfiguration.class); + ItemRepository repository = ctx.getBean(ItemRepository.class); + System.out.println("All items:"); + for (Item item : repository.getList()) { + System.out.println(item.getName() + " " + item.getColor() + " " + item.getPrice()); + } + double absoluteCost = 0; + for (Item item : repository.getList()) { + absoluteCost += item.getPrice(); + } + System.out.println("\nTotal cost: " + absoluteCost); + } } diff --git a/src/main/java/com/epam/edu/spring/core/template/annotation/InjectRandomInt.java b/src/main/java/com/epam/edu/spring/core/template/annotation/InjectRandomInt.java index 08bf472..9bda90e 100644 --- a/src/main/java/com/epam/edu/spring/core/template/annotation/InjectRandomInt.java +++ b/src/main/java/com/epam/edu/spring/core/template/annotation/InjectRandomInt.java @@ -1,4 +1,14 @@ package com.epam.edu.spring.core.template.annotation; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD, ElementType.LOCAL_VARIABLE}) public @interface InjectRandomInt { + int min(); + + int max(); } diff --git a/src/main/java/com/epam/edu/spring/core/template/bpp/InjectRandomIntBeanPostProcessor.java b/src/main/java/com/epam/edu/spring/core/template/bpp/InjectRandomIntBeanPostProcessor.java index 13d4469..63ed470 100644 --- a/src/main/java/com/epam/edu/spring/core/template/bpp/InjectRandomIntBeanPostProcessor.java +++ b/src/main/java/com/epam/edu/spring/core/template/bpp/InjectRandomIntBeanPostProcessor.java @@ -1,4 +1,37 @@ package com.epam.edu.spring.core.template.bpp; -public class InjectRandomIntBeanPostProcessor { +import com.epam.edu.spring.core.template.annotation.InjectRandomInt; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.stereotype.Component; +import org.springframework.util.ReflectionUtils; + +import java.lang.reflect.Field; +import java.util.Random; + +@Component +public class InjectRandomIntBeanPostProcessor implements BeanPostProcessor { + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) { + Field[] fields = bean.getClass().getDeclaredFields(); + for (Field field : fields) { + InjectRandomInt annotation = field.getAnnotation(InjectRandomInt.class); + if (annotation != null) { + int min = annotation.min(); + int max = annotation.max(); + + Random rnd = new Random(); + int randomValue = min + rnd.nextInt(max - min); + field.setAccessible(true); + ReflectionUtils.setField(field, bean, randomValue); + + } + } + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) { + return null; + } + } 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..3423fa4 --- /dev/null +++ b/src/main/java/com/epam/edu/spring/core/template/configuration/ColorFactory.java @@ -0,0 +1,32 @@ +package com.epam.edu.spring.core.template.configuration; + +import java.util.ArrayList; +import java.util.List; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class ColorFactory { + + private ResourceBundle prop = ResourceBundle.getBundle("application"); + ArrayList colors = new ArrayList<>(); + + public void initColors() { + + String color; + int colorNumber = 0; + while (true) { + try { + color = prop.getString("colors.value[" + colorNumber + "]"); + } catch (MissingResourceException e) { + break; + } + colors.add(color); + colorNumber++; + } + + } + + public List getColors() { + return colors; + } +} 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..7d3e86b 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,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 org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +import javax.annotation.Resource; +import java.util.ResourceBundle; + +@Configuration public class InitializerConfiguration { + public static String listName; + + @Bean(initMethod = "initColors") + public ColorFactory colorFact() { + return new ColorFactory(); + } + + + @Lazy + @Resource + @Bean + public ItemRepository itemRepository(RepositoryConfiguration rep) { + + try { + listName = ResourceBundle.getBundle("application").getString("item.repository.implementation"); + } catch (Exception e) { + listName = "array"; + } + + if (listName.equals("linked")) { + return new LinkedListItemRepository(rep.getList()); + } else { + return new ArrayListItemRepository(rep.getList()); + } + + + } + + } 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..cc40a70 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,45 @@ package com.epam.edu.spring.core.template.configuration; +import com.epam.edu.spring.core.template.bpp.InjectRandomIntBeanPostProcessor; +import com.epam.edu.spring.core.template.entity.Item; +import com.epam.edu.spring.core.template.service.SimpleItemService; +import org.springframework.context.annotation.*; + +import javax.annotation.Resource; + +@Configuration +@Import({InitializerConfiguration.class, InjectRandomIntBeanPostProcessor.class}) public class MainConfiguration { + + @Resource + @Bean + public SimpleItemService simpleItemService(ColorFactory colorFactory) { + return new SimpleItemService(colorFactory); + } + + @Lazy + @Bean + @Scope(scopeName = "prototype") + public Item item(SimpleItemService simpleItemService) { + return simpleItemService.getAndCreateNewItem(); + } + + @Bean + public RepositoryConfiguration repositoryConfiguration(SimpleItemService simpleItemService, ColorFactory colorFactory) { + RepositoryConfiguration repositoryConfiguration = new RepositoryConfiguration(); + boolean colorIsOver = false; + + while (!colorIsOver) { + try { + repositoryConfiguration.addToList(simpleItemService.getAndCreateNewItem()); + } catch (Exception e) { + colorIsOver = true; + } + + + } + return repositoryConfiguration; + + } + } 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..ba6bfd6 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,19 @@ package com.epam.edu.spring.core.template.configuration; +import com.epam.edu.spring.core.template.entity.Item; + +import java.util.ArrayList; + + public class RepositoryConfiguration { + private static ArrayList list = new ArrayList<>(); + + public void addToList(Item item) { + list.add(item); + } + + public ArrayList getList() { + return list; + } + } 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..18459a2 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 @@ -2,27 +2,42 @@ import com.epam.edu.spring.core.template.entity.Item; +import java.util.ArrayList; +import java.util.List; +import java.util.ListIterator; + /** * Репозиторий, основанный на классе ArrayList. * initialSequence должен браться из application.properties */ public class ArrayListItemRepository extends AbstractRepository implements ItemRepository { + private ArrayList items; + private ListIterator iterator; + + public ArrayList getList() { + return items; + } + + public ArrayListItemRepository(List items) { + this.items = (ArrayList) items; + } @Override public Item getById(long id) { - return null; + return (Item) items.stream().filter(item -> item.getId() == id); + } @Override public boolean createItem(Item item) { - return false; + return items.add(item); } void setInitialSequence(int val) { - //TODO + this.initialSequence = val; } void setHolder() { - //TODO + this.iterator = items.listIterator(); } } 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..4cab2a0 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 @@ -2,10 +2,13 @@ import com.epam.edu.spring.core.template.entity.Item; +import java.util.List; + public interface ItemRepository { Item getById(long id); boolean createItem(Item item); + List getList(); } 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..7fd7e60 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,45 @@ package com.epam.edu.spring.core.template.repository; +import com.epam.edu.spring.core.template.annotation.InjectRandomInt; import com.epam.edu.spring.core.template.entity.Item; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; + /** * Репозиторий, основанный на классе LinkedList. * initialSequence должен случайно генерироваться из диапазона от 1 до 100 */ public class LinkedListItemRepository extends AbstractRepository implements ItemRepository { + private LinkedList items; + private ListIterator iterator; + @InjectRandomInt(min = 0, max = 100) + private int initialSequence; + + public LinkedListItemRepository(List items) { + this.items = (LinkedList) items; + } + + public LinkedList getList() { + return items; + } @Override public Item getById(long id) { - return null; + return (Item) items.stream().filter(item -> item.getId() == id); } @Override public boolean createItem(Item item) { - return false; + return items.add(item); } void setInitialSequence(int val) { - //TODO + this.initialSequence = val; } void setHolder() { - //TODO + this.iterator = items.listIterator(); } } 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 04d95b8..c25e96c 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,4 +1,33 @@ package com.epam.edu.spring.core.template.service; +import com.epam.edu.spring.core.template.annotation.InjectRandomInt; +import com.epam.edu.spring.core.template.configuration.ColorFactory; +import com.epam.edu.spring.core.template.entity.Item; +import com.epam.edu.spring.core.template.repository.ItemRepository; + public class SimpleItemService implements ItemService { + ItemRepository repository; + ColorFactory colorFactory; + int id = -1; + @InjectRandomInt(min = 10, max = 1000) + int price; + + public SimpleItemService(ColorFactory colorFactory) { + this.colorFactory = colorFactory; + } + + public Item getAndCreateNewItem() { + id++; + return new Item(id, "Item", price, colorFactory.getColors().get(id)); + } + + @Override + public Item getById(long id) { + return repository.getById(id); + } + + @Override + public boolean createItem(Item item) { + return false; + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 735a8ff..891e233 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,5 @@ initial.sequence=14 +colors.value[0]=red +colors.value[1]=yellow +colors.value[2]=black +colors.value[3]=purple \ No newline at end of file diff --git a/src/test/java/com/epam/edu/spring/core/template/SpringEducationSkeletonApplicationTests.java b/src/test/java/com/epam/edu/spring/core/template/SpringEducationSkeletonApplicationTests.java index 128e270..9ffeac6 100644 --- a/src/test/java/com/epam/edu/spring/core/template/SpringEducationSkeletonApplicationTests.java +++ b/src/test/java/com/epam/edu/spring/core/template/SpringEducationSkeletonApplicationTests.java @@ -1,16 +1,34 @@ package com.epam.edu.spring.core.template; +import com.epam.edu.spring.core.template.configuration.ColorFactory; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import java.util.ArrayList; + +import static junit.framework.TestCase.assertTrue; + + @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(classes = SpringCoreTemplate.class) public class SpringEducationSkeletonApplicationTests { - @Test - public void contextLoads() { - } + @Test + public void contextLoads() { + assertTrue(true); + } + @Test + public void colorFactoryTest(){ + ColorFactory colorFactory = new ColorFactory(); + colorFactory.initColors(); + ArrayList colors = new ArrayList<>(); + colors.add("red"); + colors.add("yellow"); + colors.add("black"); + colors.add("purple"); + assertTrue(colors.equals(colorFactory.getColors())); + } }