diff --git a/pom.xml b/pom.xml
index 541b54d..457a90f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,10 +6,34 @@
com.epam.edu
spring-core-template
0.0.1-SNAPSHOT
+
+
+ org.springframework
+ spring-context
+ 5.2.1.RELEASE
+
+
+ org.springframework
+ spring-context-support
+ 5.2.1.RELEASE
+
+
+ org.springframework
+ spring-test
+ 5.2.1.RELEASE
+
+
+ junit
+ junit
+ 4.13
+ 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..6b76f3c 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,8 +1,22 @@
package com.epam.edu.spring.core.template;
+import com.epam.edu.spring.core.template.configuration.MainConfiguration;
+
+
+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) {
+ AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfiguration.class);
+ ApplicationContext applicationContext = annotationConfigApplicationContext;
+ applicationContext.getBean(SimpleItemValidator.class);
+
}
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..02972d0 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.entity.FactoryColor;
+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 {
+ @Lazy
+ @Bean
+ @Scope("prototype")
+ public FactoryColor factoryColor() {
+ return new FactoryColor();
+ }
}
+
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..660b972 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,11 @@
package com.epam.edu.spring.core.template.configuration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+@Configuration
+@ComponentScan("com.epam.edu.spring.core.template")
+@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..d506695 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,41 @@
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;
+import org.springframework.context.annotation.PropertySource;
+
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+
+@Configuration
+@PropertySource(value = "classpath:application.properties")
public class RepositoryConfiguration {
+ @Value(value = "${item.repository.implementation}")
+ String implementationType;
+
+ @Bean
+ public ItemRepository itemRepository() {
+ if (implementationType.equals("linked")) {
+ return linkedListItemRepository();
+ } else {
+ return arrayListItemRepository();
+ }
+ }
+
+ @Bean
+ public LinkedListItemRepository linkedListItemRepository() {
+ return new LinkedListItemRepository(new LinkedList<>());
+ }
+
+ @Bean
+ public ArrayListItemRepository arrayListItemRepository() {
+ return new ArrayListItemRepository(new ArrayList<>());
+ }
}
+
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..e74347f 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,13 @@
package com.epam.edu.spring.core.template.entity;
public enum Color {
-
+ YELLOW,
+ GREEN,
+ BLACK,
+ WHITE,
+ RED,
+ ORANGE,
+ BLUE,
+ BROWN,
+ PINK
}
diff --git a/src/main/java/com/epam/edu/spring/core/template/entity/FactoryColor.java b/src/main/java/com/epam/edu/spring/core/template/entity/FactoryColor.java
new file mode 100644
index 0000000..3eca633
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/entity/FactoryColor.java
@@ -0,0 +1,29 @@
+package com.epam.edu.spring.core.template.entity;
+
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.stereotype.Component;
+
+import java.util.Random;
+
+@Component
+public class FactoryColor implements FactoryBean {
+ public Color getColor() throws Exception {
+ return getObject();
+ }
+
+
+ @Override
+ public Color getObject() {
+ return Color.values()[new Random().nextInt(Color.values().length)];
+ }
+
+ @Override
+ public Class getObjectType() {
+ return Color.class;
+ }
+
+ @Override
+ public boolean isSingleton() {
+ return false;
+ }
+}
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..f93968a 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
@@ -17,4 +17,5 @@ public abstract class AbstractRepository {
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..e6a1645 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.context.annotation.PropertySource;
+
+import java.util.ArrayList;
/**
* Репозиторий, основанный на классе ArrayList.
* initialSequence должен браться из application.properties
*/
+
+@PropertySource(value = "classpath:application.properties")
public class ArrayListItemRepository extends AbstractRepository- implements ItemRepository {
+ public ArrayListItemRepository(ArrayList
- itemArrayList) {
+ this.itemArrayList = itemArrayList;
+ }
+
+ private ArrayList
- itemArrayList;
+
+
+ private int initialSequence;
@Override
public Item getById(long id) {
+ for (Item i : itemArrayList) {
+ if (i.getId() == id) {
+ return i;
+ }
+ }
return null;
}
@Override
public boolean createItem(Item item) {
- return false;
+ return itemArrayList.add(item);
}
+ @Override
+ @Value(value = "${initial.sequence}")
void setInitialSequence(int val) {
- //TODO
+ this.initialSequence = val;
}
+
+ @Override
void setHolder() {
- //TODO
+ holder = this.itemArrayList;
}
-}
+
+}
\ No newline at end of file
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..4a914cd 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,46 @@
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 {
+ public LinkedListItemRepository(LinkedList
- itemLinkedList) {
+ this.itemLinkedList = itemLinkedList;
+ }
+
+ private LinkedList
- itemLinkedList;
+ int initialSequence;
+
@Override
public Item getById(long id) {
+ for (Item i : itemLinkedList) {
+ if (i.getId() == id) {
+ return i;
+ }
+ }
return null;
}
@Override
public boolean createItem(Item item) {
- return false;
+ return itemLinkedList.add(item);
}
- void setInitialSequence(int val) {
- //TODO
+
+ public void setInitialSequence(int val) {
+ Random random = new Random(val);
+ this.initialSequence = random.nextInt(100);
}
+
void setHolder() {
- //TODO
+ holder = this.itemLinkedList;
}
}
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..d7b2aef 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
@@ -3,19 +3,46 @@
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 ItemRepository itemRepository;
+
private ItemValidator itemValidator;
+ @Autowired
+ public SimpleItemService(ItemRepository itemRepository, ItemValidator itemValidator) {
+ this.itemRepository = itemRepository;
+ this.itemValidator = itemValidator;
+ }
+
+ @Autowired
+ public void setItemRepository(ItemRepository itemRepository) {
+ this.itemRepository = itemRepository;
+ }
+
+ @Autowired
+ public void setItemValidator(ItemValidator itemValidator) {
+ this.itemValidator = itemValidator;
+ }
+
+
@Override
- public Item getById(long id) {
- return null;
+ public Item getById(long id) {return itemRepository.getById(id);
+ }
+
+ public ItemRepository getItemRepository() {
+ return itemRepository;
}
@Override
public boolean createItem(Item item) {
- return false;
+ return itemRepository.createItem(item);
}
+
+
}
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..e67952f 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
@@ -1,11 +1,13 @@
package com.epam.edu.spring.core.template.validator;
import com.epam.edu.spring.core.template.entity.Item;
+import org.springframework.stereotype.Component;
+@Component
public class SimpleItemValidator implements ItemValidator {
@Override
public boolean isItemValid(Item item) {
- return false;
+ return item != null;
}
}
diff --git a/src/test/java/template/TestApplication.java b/src/test/java/template/TestApplication.java
new file mode 100644
index 0000000..2eaa7b9
--- /dev/null
+++ b/src/test/java/template/TestApplication.java
@@ -0,0 +1,70 @@
+package 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.FactoryColor;
+import com.epam.edu.spring.core.template.entity.Item;
+import com.epam.edu.spring.core.template.repository.AbstractRepository;
+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.SimpleItemValidator;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.lang.reflect.Field;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = MainConfiguration.class)
+
+public class TestApplication {
+ AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfiguration.class);
+ Item itemTest = new Item(1, "ItemTest", 16.5, Color.BLACK);
+
+ @Test
+ public void testFactoryColor() throws Exception {
+ Assert.assertNotNull("Color не создался", annotationConfigApplicationContext.getBean(FactoryColor.class).getColor());
+ Assert.assertNotSame("Color не является цветом", annotationConfigApplicationContext.getBean(FactoryColor.class).getColor().getClass(), Enum.class);
+ }
+
+ @Test
+ public void testArrayListItemRepository() throws Exception {
+ ArrayListItemRepository arrayListItemRepositoryTest = (ArrayListItemRepository) annotationConfigApplicationContext.getBean("arrayListItemRepository");
+ Assert.assertTrue("Объект не добавлен в ArrayListItemRepository", arrayListItemRepositoryTest.createItem(itemTest));
+ Assert.assertEquals("Объект не существует или не найден в ArrayListItemRepository", arrayListItemRepositoryTest.getById(1), itemTest);
+ Field initialSequence = arrayListItemRepositoryTest.getClass().getDeclaredField("initialSequence");
+ initialSequence.setAccessible(true);
+ int initialSequenceValue = (int) initialSequence.get(arrayListItemRepositoryTest);
+ Assert.assertEquals("InitialSequence не считывается из проперти", 42, initialSequenceValue);
+ }
+
+ @Test
+ public void testLinkedListItemRepository() throws Exception {
+ LinkedListItemRepository linkedListItemRepositoryTest = (LinkedListItemRepository) annotationConfigApplicationContext.getBean("linkedListItemRepository");
+ Assert.assertTrue("объект не добавлен в LinkedListItemRepository", linkedListItemRepositoryTest.createItem(itemTest));
+ Assert.assertEquals("Объект не существует или не найден в LinkedListItemRepository", linkedListItemRepositoryTest.getById(1), itemTest);
+ linkedListItemRepositoryTest.setInitialSequence(15);
+ Field initialSequence = linkedListItemRepositoryTest.getClass().getDeclaredField("initialSequence");
+ initialSequence.setAccessible(true);
+ int initialSequenceValue = (int) initialSequence.get(linkedListItemRepositoryTest);
+ Assert.assertTrue("InitialSequence превосходит допустимое значение", initialSequenceValue <= 100);
+ }
+
+ @Test
+ public void testSimpleItemsService() {
+ SimpleItemService service = annotationConfigApplicationContext.getBean(SimpleItemService.class);
+ Assert.assertTrue("Объект не создан", service.createItem(itemTest));
+ Assert.assertEquals("У вас не правильно выбирается ItemRepository исходя из проперти", ArrayListItemRepository.class, service.getItemRepository().getClass());
+ Assert.assertEquals("Объект не существует или не найден в ItemRepository", service.getById(1), itemTest);
+ }
+
+ @Test
+ public void testSimpleItemValidator() {
+ SimpleItemValidator simpleItemValidator = annotationConfigApplicationContext.getBean(SimpleItemValidator.class);
+ Assert.assertTrue("Объекта не существует", simpleItemValidator.isItemValid(itemTest));
+ }
+}
diff --git a/src/test/resources/test.properties b/src/test/resources/test.properties
new file mode 100644
index 0000000..f219f99
--- /dev/null
+++ b/src/test/resources/test.properties
@@ -0,0 +1,2 @@
+initial.sequence=42
+item.repository.implementation=array
\ No newline at end of file