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()));
+ }
}