diff --git a/pom.xml b/pom.xml
index 541b54d..900c99a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,6 +7,30 @@
spring-core-template
0.0.1-SNAPSHOT
+
+
+
+
+ org.springframework
+ spring-context
+ 5.2.1.RELEASE
+
+
+ org.springframework
+ spring-test
+ 5.2.1.RELEASE
+
+
+ junit
+ junit
+ 4.12
+ 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..308cc81 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,27 @@
package com.epam.edu.spring.core.template;
+import com.epam.edu.spring.core.template.configuration.ColorFactory;
+import com.epam.edu.spring.core.template.configuration.MainConfiguration;
+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.ItemValidator;
+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) throws Exception {
+ ApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfiguration.class);
+
+ ItemValidator itemValidator = ctx.getBean(ItemValidator.class);
+ SimpleItemService itemServiceConstructor = (SimpleItemService) ctx.getBean("itemServiceConstructor");
+ SimpleItemService itemServiceSetter = (SimpleItemService) ctx.getBean("itemServiceSetter");
+
+ LinkedListItemRepository linkedListItemRepository = ctx.getBean(LinkedListItemRepository.class);
+ ArrayListItemRepository arrayListItemRepository = ctx.getBean(ArrayListItemRepository.class);
+ ColorFactory colorFactory = ctx.getBean(ColorFactory.class);
}
}
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..ac768e4
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/configuration/ColorFactory.java
@@ -0,0 +1,19 @@
+package com.epam.edu.spring.core.template.configuration;
+
+import com.epam.edu.spring.core.template.entity.Color;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import java.util.Random;
+
+@Component
+@Lazy
+public class ColorFactory {
+
+ @Scope("prototype")
+ public Color getColor() {
+ return Color.values()[new Random().nextInt(Color.values().length)];
+ }
+
+}
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..40a4dc1 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,26 @@
package com.epam.edu.spring.core.template.configuration;
-public class InitializerConfiguration {
+import com.epam.edu.spring.core.template.entity.Color;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.context.annotation.Configuration;
+import java.util.Objects;
+
+@Configuration
+public class InitializerConfiguration implements FactoryBean {
+
+ @Override
+ public ColorFactory getObject() {
+ return new ColorFactory();
+ }
+
+ @Override
+ public Class> getObjectType() {
+ return ColorFactory.class;
+ }
+
+ public Color getColor() throws Exception {
+ return Objects.requireNonNull(getObject()).getColor();
+ }
+
}
+
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..a1c0b02 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,38 @@
package com.epam.edu.spring.core.template.configuration;
+import com.epam.edu.spring.core.template.repository.InjectRandomIntAnnotationBeanPostProcessor;
+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.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.PropertySource;
+
+@Configuration
+@PropertySource("classpath:application.properties")
+@Import({ InitializerConfiguration.class, RepositoryConfiguration.class, InjectRandomIntAnnotationBeanPostProcessor.class})
public class MainConfiguration {
+
+ @Bean
+ public ItemValidator itemValidator() {
+ return new SimpleItemValidator();
+ }
+
+ @Bean
+ @Qualifier("itemServiceConstructor")
+ public SimpleItemService itemServiceConstructor(RepositoryConfiguration repositoryConfiguration) {
+ return new SimpleItemService(repositoryConfiguration.getItemRepository(),itemValidator());
+ }
+
+ @Bean
+ public SimpleItemService itemServiceSetter(RepositoryConfiguration repositoryConfiguration) {
+ SimpleItemService simpleItemService = new SimpleItemService();
+ simpleItemService.setItemRepository(repositoryConfiguration.getItemRepository());
+ simpleItemService.setItemValidator(itemValidator());
+ return simpleItemService;
+ }
+
}
+
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..b30f9fd 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,38 @@
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;
+
+@Configuration
public class RepositoryConfiguration {
+
+ private ItemRepository itemRepository;
+
+ @Bean
+ public ArrayListItemRepository arrayListItemRepository() {
+ return new ArrayListItemRepository();
+ }
+
+ @Bean
+ public LinkedListItemRepository linkedListItemRepository() {
+ return new LinkedListItemRepository();
+ }
+
+ @Value("${item.repository.implementation}")
+ private void initConfiguration (String implementation) {
+ if (implementation.equals("linked")) {
+ itemRepository = linkedListItemRepository();
+ } else {
+ itemRepository = arrayListItemRepository();
+ }
+ }
+
+ public ItemRepository getItemRepository() {
+ return itemRepository;
+ }
+
}
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..7fc2351 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,5 @@ public Color getColor() {
public void setColor(Color color) {
this.color = color;
}
+
}
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..7f66c8c 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,42 @@
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 javax.annotation.PostConstruct;
+import java.util.ArrayList;
/**
* Репозиторий, основанный на классе ArrayList.
* initialSequence должен браться из application.properties
*/
+
+@PropertySource("classpath:application.properties")
public class ArrayListItemRepository extends AbstractRepository- implements ItemRepository {
+
@Override
public Item getById(long id) {
- return null;
+ return holder.stream().filter(o -> (o.getId() == id)).findFirst().orElse(null);
}
@Override
public boolean createItem(Item item) {
- return false;
+ item.setId(initialSequence);
+ holder.add(item);
+ initialSequence++;
+ return true;
}
+ @Value("${initial.sequence}")
+ @Override
void setInitialSequence(int val) {
- //TODO
+ initialSequence = val;
}
+ @PostConstruct
void setHolder() {
- //TODO
+ holder = new ArrayList<>();
}
+
}
diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomInt.java b/src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomInt.java
new file mode 100644
index 0000000..b00d851
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomInt.java
@@ -0,0 +1,10 @@
+package com.epam.edu.spring.core.template.repository;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface InjectRandomInt {
+ int min();
+ int max();
+}
diff --git a/src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomIntAnnotationBeanPostProcessor.java b/src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomIntAnnotationBeanPostProcessor.java
new file mode 100644
index 0000000..1eaa85b
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/repository/InjectRandomIntAnnotationBeanPostProcessor.java
@@ -0,0 +1,39 @@
+package com.epam.edu.spring.core.template.repository;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.context.annotation.Configuration;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Random;
+
+@Configuration
+public class InjectRandomIntAnnotationBeanPostProcessor implements BeanPostProcessor {
+
+ @Override
+ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+ Method[] declaredMethods = bean.getClass().getDeclaredMethods();
+ for (Method item : declaredMethods) {
+ InjectRandomInt annotation = item.getAnnotation(InjectRandomInt.class);
+ if (annotation != null) {
+ int min = annotation.min();
+ int max = annotation.max();
+ Random random = new Random();
+
+ try {
+ item.invoke(bean, random.nextInt(max - min) + min);
+ } catch (IllegalAccessException | InvocationTargetException e) {
+ e.printStackTrace();
+ }
+
+ }
+ }
+ return bean;
+ }
+
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+ return bean;
+ }
+
+}
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..3002821 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,39 @@
package com.epam.edu.spring.core.template.repository;
import com.epam.edu.spring.core.template.entity.Item;
+import org.springframework.stereotype.Component;
+import javax.annotation.PostConstruct;
+import java.util.LinkedList;
/**
* Репозиторий, основанный на классе LinkedList.
* initialSequence должен случайно генерироваться из диапазона от 1 до 100
*/
+@Component
public class LinkedListItemRepository extends AbstractRepository
- implements ItemRepository {
+
@Override
public Item getById(long id) {
- return null;
+ return holder.stream().filter(o -> (o.getId() == id)).findFirst().orElse(null);
}
@Override
public boolean createItem(Item item) {
- return false;
+ item.setId(initialSequence);
+ holder.add(item);
+ initialSequence++;
+ return true;
}
+ @InjectRandomInt(min = 1, max = 100)
void setInitialSequence(int val) {
- //TODO
+ initialSequence = val;
}
+ @PostConstruct
void setHolder() {
- //TODO
+ 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 802d512..5238c15 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
@@ -9,13 +9,39 @@ public class SimpleItemService implements ItemService {
private ItemRepository itemRepository;
private ItemValidator itemValidator;
+ public SimpleItemService() {
+
+ }
+
+ public SimpleItemService(ItemRepository itemRepository, ItemValidator itemValidator) {
+ this.itemRepository = itemRepository;
+ this.itemValidator = itemValidator;
+ }
+
@Override
public Item getById(long id) {
- return null;
+ return itemRepository.getById(id);
}
@Override
public boolean createItem(Item item) {
- return false;
+ if (itemValidator.isItemValid(item)) {
+ return itemRepository.createItem(item);
+ } else {
+ return false;
+ }
+ }
+
+ public void setItemRepository(ItemRepository itemRepository) {
+ this.itemRepository = itemRepository;
+ }
+
+ public ItemRepository getItemRepository() {
+ return itemRepository;
}
+
+ public void setItemValidator(ItemValidator itemValidator) {
+ this.itemValidator = itemValidator;
+ }
+
}
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..47c8b2b 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,7 @@ public class SimpleItemValidator implements ItemValidator {
@Override
public boolean isItemValid(Item item) {
- return false;
+ return true;
}
+
}
diff --git a/src/test/java/com/epam/edu/spring/core/template/BusinessLogicTest.java b/src/test/java/com/epam/edu/spring/core/template/BusinessLogicTest.java
new file mode 100644
index 0000000..5921536
--- /dev/null
+++ b/src/test/java/com/epam/edu/spring/core/template/BusinessLogicTest.java
@@ -0,0 +1,50 @@
+package com.epam.edu.spring.core.template;
+
+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.ArrayListItemRepository;
+import com.epam.edu.spring.core.template.repository.LinkedListItemRepository;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes=MainConfiguration.class)
+public class BusinessLogicTest {
+
+ @Autowired
+ private ArrayListItemRepository arrayListItemRepository;
+ @Autowired
+ private LinkedListItemRepository linkedListItemRepository;
+
+ @Autowired
+ ApplicationContext ctx;
+
+ @Test
+ public void createItemTest1() {
+ Item item = new Item(0,"item", 200, null);
+ arrayListItemRepository.createItem(item);
+ Assert.assertEquals(item, arrayListItemRepository.getById(42));
+ }
+
+ @Test
+ public void createItemTest2() {
+ Item item = new Item(0,"NewItem", 200, null);
+ arrayListItemRepository.createItem(item);
+ Assert.assertNotEquals(item, arrayListItemRepository.getById(42));
+ Assert.assertEquals(item, arrayListItemRepository.getById(43));
+ }
+
+ @Test
+ public void addedTwoItemLinkedListTest() {
+ Item itemOne = new Item(0,"itemOne", 2000000001, null);
+ Item itemTwo = new Item(0,"itemTwo", 200, null);
+ Assert.assertTrue(linkedListItemRepository.createItem(itemOne));
+ Assert.assertTrue(linkedListItemRepository.createItem(itemTwo));
+ }
+
+}
diff --git a/src/test/java/com/epam/edu/spring/core/template/LoadContextTest.java b/src/test/java/com/epam/edu/spring/core/template/LoadContextTest.java
new file mode 100644
index 0000000..b577a46
--- /dev/null
+++ b/src/test/java/com/epam/edu/spring/core/template/LoadContextTest.java
@@ -0,0 +1,60 @@
+package com.epam.edu.spring.core.template;
+
+import com.epam.edu.spring.core.template.configuration.ColorFactory;
+import com.epam.edu.spring.core.template.configuration.MainConfiguration;
+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.ItemValidator;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes=MainConfiguration.class)
+public class LoadContextTest {
+
+ @Autowired
+ ApplicationContext ctx;
+
+ @Test
+ public void itemValidatorCreateTest() {
+ ItemValidator itemValidator = ctx.getBean(ItemValidator.class);
+ Assert.assertNotNull(itemValidator);
+ }
+
+ @Test
+ public void itemServiceConstructorCreateTest() {
+ SimpleItemService itemServiceConstructor = (SimpleItemService) ctx.getBean("itemServiceConstructor");
+ Assert.assertNotNull(itemServiceConstructor);
+ }
+
+ @Test
+ public void itemServiceSetterCreateTest() {
+ SimpleItemService itemServiceSetter = (SimpleItemService) ctx.getBean("itemServiceSetter");
+ Assert.assertNotNull(itemServiceSetter);
+ }
+
+ @Test
+ public void linkedListItemRepositoryCreateTest() {
+ LinkedListItemRepository linkedListItemRepository = ctx.getBean(LinkedListItemRepository.class);
+ Assert.assertNotNull(linkedListItemRepository);
+ }
+
+ @Test
+ public void arrayListItemRepositoryCreateTest() {
+ ArrayListItemRepository arrayListItemRepository = ctx.getBean(ArrayListItemRepository.class);
+ Assert.assertNotNull(arrayListItemRepository);
+ }
+
+ @Test
+ public void colorFactoryCreateTest() {
+ ColorFactory colorFactory = ctx.getBean(ColorFactory.class);
+ Assert.assertNotNull(colorFactory);
+ }
+
+}