diff --git a/pom.xml b/pom.xml
index 541b54d..989fafb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,4 +12,36 @@
1.8
+
+
+
+ org.springframework
+ spring-context
+ 5.2.1.RELEASE
+
+
+
+ org.springframework
+ spring-test
+ 5.2.1.RELEASE
+ test
+
+
+
+ junit
+ junit
+ 4.13
+ test
+
+
+
+ org.hamcrest
+ hamcrest-all
+ 1.3
+ 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..f819df2 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,30 @@
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.ItemRepository;
+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) {
+ ApplicationContext context =
+ new AnnotationConfigApplicationContext(MainConfiguration.class);
+
+ ItemRepository itemService = context.getBean("itemRepository", ItemRepository.class);
+
+ Item item1 = new Item(1, "Car", 100, context.getBean("colorFactory", Color.class));
+ Item item2 = new Item(2, "Bus", 200, context.getBean("colorFactory", Color.class));
+ Item item3 = new Item(3, "Airplane", 2000, context.getBean("colorFactory", Color.class));
- }
+ itemService.createItem(item1);
+ itemService.createItem(item2);
+ itemService.createItem(item3);
+ System.out.println(itemService.getById(1) + " initialSequence: " + itemService.getInitialSequence());
+ System.out.println(itemService.getById(2) + " initialSequence: " + itemService.getInitialSequence());
+ System.out.println(itemService.getById(3) + " initialSequence: " + itemService.getInitialSequence());
+ }
}
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..416703b 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,22 @@
package com.epam.edu.spring.core.template.configuration;
+import com.epam.edu.spring.core.template.entity.Color;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.context.annotation.Scope;
+
+import java.util.Random;
+
+@Configuration
public class InitializerConfiguration {
+
+ @Bean
+ @Scope("prototype")
+ @Lazy
+ public Color colorFactory() {
+ return Color.values()[new Random().nextInt(Color.values().length)];
+ }
+
+
}
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..bb548cd 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,10 @@
package com.epam.edu.spring.core.template.configuration;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+@Configuration
+@Import({InitializerConfiguration.class, RepositoryConfiguration.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..0e66371 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,36 @@
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;
+
+@Configuration
+@PropertySource("classpath:application.properties")
public class RepositoryConfiguration {
+
+ @Value("${item.repository.implementation}")
+ String itemRepositoryImplementationType;
+
+ @Bean
+ public ArrayListItemRepository arrayListItemRepository() {
+ return new ArrayListItemRepository();
+ }
+
+ @Bean
+ public LinkedListItemRepository linkedListItemRepository() {
+ return new LinkedListItemRepository();
+ }
+
+ @Bean
+ public ItemRepository itemRepository() {
+ if (itemRepositoryImplementationType.equals("linked")) {
+ return linkedListItemRepository();
+ } else {
+ return arrayListItemRepository();
+ }
+ }
}
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..46c6e7b 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,5 @@
package com.epam.edu.spring.core.template.entity;
public enum Color {
-
+ Red, Orange, Green, Blue, Indigo, Violet
}
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..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..9f03d0b 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,38 @@
*/
public class ArrayListItemRepository extends AbstractRepository- implements ItemRepository {
+ private final ArrayList
- itemArrayList = new ArrayList<>();
+
+ @Value("${initial.sequence}")
+ private long initialSequence = super.initialSequence;
+
+
@Override
public Item getById(long id) {
+ for (Item item : itemArrayList) {
+ if (item.getId() == id) {
+ return item;
+ }
+ }
return null;
}
@Override
public boolean createItem(Item item) {
- return false;
+ return itemArrayList.add(item);
}
+
void setInitialSequence(int val) {
- //TODO
+ this.initialSequence = val;
}
void setHolder() {
- //TODO
+ holder = itemArrayList;
+ }
+
+ public long getInitialSequence() {
+ return initialSequence;
}
+
}
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..d471fb1 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
@@ -8,4 +8,6 @@ public interface ItemRepository {
boolean createItem(Item item);
+ long getInitialSequence();
+
}
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..1a6d168 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,43 @@
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 {
+ private final LinkedList
- itemLinkedList = new LinkedList<>();
+
+ private long initialSequence = new Random().nextLong();
+
@Override
public Item getById(long id) {
+ for (Item item : itemLinkedList) {
+ if (item.getId() == id) {
+ return item;
+ }
+ }
return null;
}
@Override
public boolean createItem(Item item) {
- return false;
+ return itemLinkedList.add(item);
}
void setInitialSequence(int val) {
- //TODO
+ initialSequence = val;
}
void setHolder() {
- //TODO
+ holder = this.itemLinkedList;
+ }
+
+ public long getInitialSequence() {
+ return initialSequence;
}
}
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..084bfe3 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
@@ -6,16 +6,30 @@
public class SimpleItemService implements ItemService {
+
private ItemRepository itemRepository;
private ItemValidator itemValidator;
+ public SimpleItemService(ItemRepository itemRepository, ItemValidator itemValidator) {
+ this.itemRepository = itemRepository;
+ this.itemValidator = itemValidator;
+ }
+
+ public void setItemRepository(ItemRepository itemRepository) {
+ this.itemRepository = itemRepository;
+ }
+
+ public void setItemValidator(ItemValidator itemValidator) {
+ this.itemValidator = itemValidator;
+ }
+
@Override
public Item getById(long id) {
- return null;
+ return itemRepository.getById(id);
}
@Override
public boolean createItem(Item item) {
- return false;
+ return itemValidator.isItemValid(item) && 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..ae950c6 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,6 @@ public class SimpleItemValidator implements ItemValidator {
@Override
public boolean isItemValid(Item item) {
- return false;
+ return item != null;
}
}
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/main/tests/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java b/src/main/tests/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java
new file mode 100644
index 0000000..d3d20e6
--- /dev/null
+++ b/src/main/tests/com/epam/edu/spring/core/template/SpringCoreTemplateTest.java
@@ -0,0 +1,99 @@
+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.ItemRepository;
+import com.epam.edu.spring.core.template.repository.LinkedListItemRepository;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.Assert.*;
+
+@RunWith(SpringRunner.class)
+@ContextConfiguration(classes = MainConfiguration.class)
+public class SpringCoreTemplateTest {
+
+ @Value("${initial.sequence}")
+ int itemRepositoryImplementation;
+
+ @Value("${item.repository.implementation}")
+ String repositoryImplementation;
+
+ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfiguration.class);
+ Item item1 = new Item(1, "item1", 10.2, Color.Indigo);
+ Item item2 = new Item(2, "item2", 15.2, Color.Blue);
+ Item item3 = new Item(3, "item3", 0.2, Color.Orange);
+
+ @Test
+ public void contextNotNullTest() {
+ assertNotNull(context);
+ }
+
+ @Test
+ public void colorFactoryTest() {
+ assertNotNull(context.getBean("colorFactory", Color.class));
+ }
+
+ @Test
+ public void arrayListItemRepository_BeanCreatedTest() {
+ assertNotNull(context.getBean("arrayListItemRepository", ItemRepository.class));
+ }
+
+ @Test
+ public void linkedListItemRepository_BeanCreatedTest() {
+ assertNotNull(context.getBean("linkedListItemRepository", ItemRepository.class));
+ }
+
+ @Test
+ public void itemRepository_BeanCreatedTest() {
+ assertNotNull(context.getBean("itemRepository", ItemRepository.class));
+ }
+
+ @Test
+ public void itemRepository_addtoList() {
+ ItemRepository itemService = context.getBean("itemRepository", ItemRepository.class);
+
+ itemService.createItem(item1);
+ itemService.createItem(item2);
+ itemService.createItem(item3);
+
+ assertEquals(itemService.getById(1), item1);
+ }
+
+ @Test
+ public void createItem_Test() {
+ ItemRepository itemService = context.getBean("itemRepository", ItemRepository.class);
+ assertTrue(itemService.createItem(item1));
+ }
+
+
+ @Test
+ public void readProp_Test() {
+ ItemRepository itemRepository = context.getBean("arrayListItemRepository", ItemRepository.class);
+
+ if (itemRepository instanceof ArrayListItemRepository) {
+ assertEquals(itemRepository.getInitialSequence(), itemRepositoryImplementation);
+ } else {
+ assertNotEquals(itemRepository.getInitialSequence(), itemRepositoryImplementation);
+ }
+ }
+
+ @Test
+ public void readPropRepositoryImpl_Test() {
+ ItemRepository itemRepository = context.getBean("itemRepository", ItemRepository.class);
+
+ if (repositoryImplementation.equals("linked")) {
+ assertTrue(itemRepository instanceof LinkedListItemRepository);
+ } else {
+ assertTrue(itemRepository instanceof ArrayListItemRepository);
+ }
+ }
+
+
+}
\ No newline at end of file