diff --git a/pom.xml b/pom.xml
index 541b54d..c5bac14 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,5 +11,25 @@
1.8
1.8
+
+
+ org.springframework
+ spring-context
+ 5.2.1.RELEASE
+
+
+ org.springframework
+ spring-test
+ 5.2.1.RELEASE
+ test
+
+
+
+ junit
+ junit
+ 4.12
+ 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..59ccf69 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,34 @@
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.LinkedListItemRepository;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+
+
public class SpringCoreTemplate {
public static void main(String[] args) {
+ System.out.println("hello word");
- }
+ AnnotationConfigApplicationContext context
+ = new AnnotationConfigApplicationContext(MainConfiguration.class);
+
+ //ArrayListItemRepository a = (ArrayListItemRepository) context.getBean("itemRepository");
+ LinkedListItemRepository l = (LinkedListItemRepository) context.getBean("itemRepository");
+
+ Item item = new Item(1, "Pasha", 20000000, Color.GREEN);
+ l.createItem(item);
+ Item pasha = l.getById(1);
+ System.out.println(pasha);
+
+ Item item2 = new Item(2, "Masha", 10000000, Color.YELLOW);
+
+ context.close();
+
+ }
}
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..2f04270 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,20 @@
package com.epam.edu.spring.core.template.configuration;
+
+import com.epam.edu.spring.core.template.entity.ColorFactory;
+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 {
+
+ @Bean
+ @Lazy
+ @Scope("prototype")
+ public ColorFactory colorFactory() {
+ return new ColorFactory();
+ }
+
}
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..36fbc9a 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,43 @@
package com.epam.edu.spring.core.template.configuration;
+import com.epam.edu.spring.core.template.repository.ItemRepository;
+import com.epam.edu.spring.core.template.service.ItemService;
+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.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.PropertySource;
+
+@PropertySource("application.properties")
+@Import({RepositoryConfiguration.class, InitializerConfiguration.class})
public class MainConfiguration {
+
+ @Value("${item.repository.implementation}")
+ String implementation;
+
+ @Autowired
+ RepositoryConfiguration repositoryConfiguration;
+ @Autowired
+ InitializerConfiguration initializerConfiguration;
+
+ @Bean
+ public ItemRepository itemRepository() {
+ if (implementation.equals("linked")) {
+ return repositoryConfiguration.linkedListItemRepository();
+ }
+ return repositoryConfiguration.arrayListItemRepository();
+ }
+
+ @Bean
+ public ItemValidator itemValidator(){
+ return new SimpleItemValidator();
+ }
+
+ @Bean
+ public ItemService itemService(){
+ return new SimpleItemService(itemRepository(), itemValidator());
+ }
}
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..6f5f163 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,24 @@
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 java.util.ArrayList;
+import java.util.LinkedList;
+
+@Configuration
public class RepositoryConfiguration {
+
+ @Bean
+ public ItemRepository arrayListItemRepository() {
+ return new ArrayListItemRepository(new ArrayList<>());
+ }
+ @Bean
+ public ItemRepository linkedListItemRepository() {
+ return new LinkedListItemRepository(new LinkedList<>());
+ }
+
}
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..d8100ec 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,12 @@
package com.epam.edu.spring.core.template.entity;
public enum Color {
+ RED,
+ BLUE,
+ GREEN,
+ BROWN,
+ YELLOW,
+ PINK;
+
}
diff --git a/src/main/java/com/epam/edu/spring/core/template/entity/ColorFactory.java b/src/main/java/com/epam/edu/spring/core/template/entity/ColorFactory.java
new file mode 100644
index 0000000..5044b1d
--- /dev/null
+++ b/src/main/java/com/epam/edu/spring/core/template/entity/ColorFactory.java
@@ -0,0 +1,28 @@
+package com.epam.edu.spring.core.template.entity;
+
+import org.springframework.beans.factory.FactoryBean;
+import java.util.Random;
+
+
+public class ColorFactory implements FactoryBean {
+
+ @Override
+ public Color getObject() throws Exception {
+ return Color.values()[new Random().nextInt(Color.values().length)];
+ }
+
+ @Override
+ public Class> getObjectType() {
+ return ColorFactory.class;
+ }
+
+ @Override
+ public boolean isSingleton() {
+ return false;
+ }
+
+ public Color getColor(){
+ return Color.values()[new Random().nextInt(Color.values().length)];
+ }
+
+}
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..d2107c7 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
@@ -7,6 +7,7 @@
* ID сущности генерируется, исходя из initialSequence
* @param
*/
+
public abstract class AbstractRepository {
protected long initialSequence = 0;
@@ -15,6 +16,10 @@ public abstract class AbstractRepository {
abstract void setInitialSequence(int val);
+ public long getInitialSequence() {
+ return initialSequence;
+ }
+
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..d9e896d 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,41 @@
*/
public class ArrayListItemRepository extends AbstractRepository- implements ItemRepository {
+ // private final ArrayList
- listItem;
+ @Value("${initial.sequence}")
+ public long initialSequence;
+
+ public ArrayListItemRepository(ArrayList
- listItem) {
+ this.holder = listItem;
+ }
+
@Override
public Item getById(long id) {
+ for (Item item : holder) {
+ if (item.getId() == id) {
+ return item;
+ }
+ }
return null;
}
@Override
public boolean createItem(Item item) {
- return false;
+ for (Item itemInList : holder) {
+ if (itemInList.getId() == item.getId()) {
+ return false;
+ }
+ }
+ holder.add(item);
+ return true;
}
void setInitialSequence(int val) {
- //TODO
+ this.initialSequence=val;
}
+
void setHolder() {
- //TODO
+ this.holder = new ArrayList<>();
}
}
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..7c9b8ff 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,51 @@
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 {
+ long initialSequence = new Random().nextInt(100);
+
+ public LinkedListItemRepository(LinkedList
- listItem) {
+ this.holder = listItem;
+ }
@Override
public Item getById(long id) {
+ for (Item item : holder) {
+ if (item.getId() == id) {
+ return item;
+ }
+ }
return null;
}
@Override
public boolean createItem(Item item) {
- return false;
+ for (Item itemInList : holder) {
+ if (itemInList.getId() == item.getId()) {
+ return false;
+ }
+ }
+ holder.add(item);
+ return true;
}
void setInitialSequence(int val) {
- //TODO
+ this.initialSequence = val;
+ }
+
+ @Override
+ public long getInitialSequence() {
+ return initialSequence;
}
void setHolder() {
- //TODO
+ this.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 cb83f39..6a47c74 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,20 +1,37 @@
package com.epam.edu.spring.core.template.service;
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 ItemService itemService;
private ItemValidator itemValidator;
+ private ItemRepository repository;
+
+ @Autowired
+ public SimpleItemService(ItemRepository repository, ItemValidator validator){
+ this.repository=repository;
+ this.itemValidator=validator;
+ }
+
+ @Autowired
+ public void setItemValidator(ItemValidator itemValidator) {
+ this.itemValidator = itemValidator;
+ }
@Override
public Item getById(long id) {
- return null;
+ return repository.getById(id);
}
@Override
public boolean createItem(Item item) {
+ if (itemValidator.isItemValid(item))
+ return repository.createItem(item);
return false;
}
}
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..df55d42 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
@@ -4,8 +4,10 @@
public class SimpleItemValidator implements ItemValidator {
+ //допустим нельзя создовать имена с пробелами
+ // и price имеет ограничения в 5 000 000
@Override
public boolean isItemValid(Item item) {
- return false;
+ return !item.getName().contains(" ") && !(item.getPrice() > 50000000);
}
}
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/test/java/com/epam/edu/spring/core/template/configuration/MainConfigurationTest.java b/src/test/java/com/epam/edu/spring/core/template/configuration/MainConfigurationTest.java
new file mode 100644
index 0000000..af21d33
--- /dev/null
+++ b/src/test/java/com/epam/edu/spring/core/template/configuration/MainConfigurationTest.java
@@ -0,0 +1,39 @@
+package com.epam.edu.spring.core.template.configuration;
+
+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.LinkedListItemRepository;
+import com.epam.edu.spring.core.template.service.SimpleItemService;
+import junit.framework.TestCase;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.test.context.ContextConfiguration;
+
+
+
+
+@ContextConfiguration(classes = MainConfiguration.class)
+public class MainConfigurationTest extends TestCase {
+ AnnotationConfigApplicationContext context
+ = new AnnotationConfigApplicationContext(MainConfiguration.class);
+
+ public void testItemRepository() {
+ LinkedListItemRepository l = (LinkedListItemRepository) context.getBean("itemRepository");
+ assertTrue(l.getInitialSequence()>0 && l.getInitialSequence()<100);
+ }
+
+ public void testItemService(){
+ SimpleItemService s = (SimpleItemService) context.getBean("itemService");
+ Item item1 = new Item(1, "Pasha", 20000000, Color.GREEN);
+ Item item2 = new Item(2, "Masha", 10000000, Color.BLUE);
+ Item item3 = new Item(3, "Dasha", 5000000, Color.YELLOW);
+ Item item4 = new Item(1, "Pasha", 20000000, Color.GREEN);
+ assertTrue(s.createItem(item1));
+ assertTrue(s.createItem(item2));
+ assertTrue(s.createItem(item3));
+ assertFalse(s.createItem(item4));
+ assertEquals(s.getById(2), item2);
+ assertEquals(s.getById(4), null);
+ System.out.println(s.getById(1));
+
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepositoryTest.java b/src/test/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepositoryTest.java
new file mode 100644
index 0000000..4302c20
--- /dev/null
+++ b/src/test/java/com/epam/edu/spring/core/template/repository/ArrayListItemRepositoryTest.java
@@ -0,0 +1,36 @@
+package com.epam.edu.spring.core.template.repository;
+
+import com.epam.edu.spring.core.template.entity.Color;
+import com.epam.edu.spring.core.template.entity.Item;
+import junit.framework.TestCase;
+import org.junit.Before;
+
+import java.util.ArrayList;
+
+
+public class ArrayListItemRepositoryTest extends TestCase {
+
+ ArrayListItemRepository l = new ArrayListItemRepository(new ArrayList<>());
+ Item item = new Item(1, "Pasha", 20000000, Color.GREEN);
+ Item item2 = new Item(2, "Masha", 10000000, Color.YELLOW);
+
+ @Before
+ public void setUp(){
+ l.createItem(item);
+ l.createItem(item2);
+ }
+
+
+ public void testGetById() {
+ assertEquals(l.getById(1).getName(), "Pasha");
+ assertEquals(l.getById(2).getColor(), Color.YELLOW);
+ }
+
+ public void testCreateItem() {
+ Item item3 = new Item(2, "Sasha", 5000, Color.BLUE);
+ assertFalse(l.createItem(item3));
+
+ Item item4 = new Item(3, "Sasha", 5000, Color.BLUE);
+ assertTrue(l.createItem(item4));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepositoryTest.java b/src/test/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepositoryTest.java
new file mode 100644
index 0000000..3d96da1
--- /dev/null
+++ b/src/test/java/com/epam/edu/spring/core/template/repository/LinkedListItemRepositoryTest.java
@@ -0,0 +1,35 @@
+package com.epam.edu.spring.core.template.repository;
+
+import com.epam.edu.spring.core.template.entity.Color;
+import com.epam.edu.spring.core.template.entity.Item;
+import junit.framework.TestCase;
+import org.junit.Before;
+
+import java.util.LinkedList;
+
+public class LinkedListItemRepositoryTest extends TestCase {
+
+ LinkedListItemRepository l = new LinkedListItemRepository(new LinkedList<>());
+ Item item = new Item(1, "Pasha", 20000000, Color.GREEN);
+ Item item2 = new Item(2, "Masha", 10000000, Color.YELLOW);
+
+ @Before
+ public void setUp(){
+ l.createItem(item);
+ l.createItem(item2);
+ }
+
+
+ public void testGetById() {
+ assertEquals(l.getById(1).getName(), "Pasha");
+ assertEquals(l.getById(2).getColor(), Color.YELLOW);
+ }
+
+ public void testCreateItem() {
+ Item item3 = new Item(2, "Sasha", 5000, Color.BLUE);
+ assertFalse(l.createItem(item3));
+
+ Item item4 = new Item(3, "Sasha", 5000, Color.BLUE);
+ assertTrue(l.createItem(item4));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/epam/edu/spring/core/template/validator/SimpleItemValidatorTest.java b/src/test/java/com/epam/edu/spring/core/template/validator/SimpleItemValidatorTest.java
new file mode 100644
index 0000000..17c029e
--- /dev/null
+++ b/src/test/java/com/epam/edu/spring/core/template/validator/SimpleItemValidatorTest.java
@@ -0,0 +1,18 @@
+package com.epam.edu.spring.core.template.validator;
+
+import com.epam.edu.spring.core.template.entity.Color;
+import com.epam.edu.spring.core.template.entity.Item;
+import junit.framework.TestCase;
+
+public class SimpleItemValidatorTest extends TestCase {
+
+ public void testIsItemValid() {
+ SimpleItemValidator s = new SimpleItemValidator();
+ Item item = new Item(1, "Pasha", 20000000, Color.GREEN);
+ assertTrue(s.isItemValid(item));
+ Item item2 = new Item(1, "Pasha", 60000000, Color.GREEN);
+ assertFalse(s.isItemValid(item2));
+ Item item3 = new Item(1, "Pasha Ogorodnikov", 20000000, Color.GREEN);
+ assertFalse(s.isItemValid(item3));
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/testAplication.properties b/src/test/resources/testAplication.properties
new file mode 100644
index 0000000..864c68f
--- /dev/null
+++ b/src/test/resources/testAplication.properties
@@ -0,0 +1,2 @@
+initial.sequence=42
+item.repository.implementation=linked
\ No newline at end of file