Skip to content

Added business logic and tests #6

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,30 @@
<artifactId>spring-core-template</artifactId>
<version>0.0.1-SNAPSHOT</version>


<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

</dependencies>



<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -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)];
}

}
Original file line number Diff line number Diff line change
@@ -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<ColorFactory> {

@Override
public ColorFactory getObject() {
return new ColorFactory();
}

@Override
public Class<?> getObjectType() {
return ColorFactory.class;
}

public Color getColor() throws Exception {
return Objects.requireNonNull(getObject()).getColor();
}

}

Original file line number Diff line number Diff line change
@@ -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;
}
Comment on lines +29 to +35

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В задании имелось ввиду немного другое, нужно было при помощи аннотации @Autowired внедрить зависимости


}

Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,5 @@ public Color getColor() {
public void setColor(Color color) {
this.color = color;
}

}
Original file line number Diff line number Diff line change
@@ -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<Item> 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<>();
}

}
Original file line number Diff line number Diff line change
@@ -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();
}
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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<Item> 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<>();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ public class SimpleItemValidator implements ItemValidator {

@Override
public boolean isItemValid(Item item) {
return false;
return true;
}

}
Loading