Skip to content

Commit

Permalink
add solution, tests, modified README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Nick97-git committed Mar 29, 2022
1 parent 0d0097c commit 36e745b
Show file tree
Hide file tree
Showing 14 changed files with 382 additions and 1 deletion.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
List<User> getAll();
}
```

- User should have `age`, `name` fields and overridden `equals()` and `hashcode()`

- In the Main class configure ApplicationContext and show how you are saving User into DB and
reading him back

Expand Down
53 changes: 52 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,58 @@
</maven.checkstyle.plugin.configLocation>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.17</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.7.Final</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.17</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.4.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.17</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
Expand Down Expand Up @@ -57,4 +109,3 @@
</pluginManagement>
</build>
</project>

2 changes: 2 additions & 0 deletions src/main/java/mate/academy/spring/Main.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
package mate.academy.spring;

public class Main {
public static void main(String[] args) {
}
}
47 changes: 47 additions & 0 deletions src/main/java/mate/academy/spring/config/AppConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package mate.academy.spring.config;

import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;

@Configuration
@PropertySource("classpath:application.properties")
@ComponentScan(basePackages = "mate.academy.spring")
public class AppConfig {
@Autowired
private Environment environment;

@Bean
public DataSource getDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(environment.getProperty("db.driver"));
dataSource.setUrl(environment.getProperty("db.url"));
dataSource.setUsername(environment.getProperty("db.username"));
dataSource.setPassword(environment.getProperty("db.password"));
return dataSource;
}

@Bean
public LocalSessionFactoryBean getSessionFactory() {
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setDataSource(getDataSource());

Properties properties = new Properties();
properties.put("show_sql", environment.getProperty("hibernate.show_sql"));
properties.put("hibernate.hbm2ddl.auto",
environment.getProperty("hibernate.hbm2_ddl.auto"));
properties.put("hibernate.dialect",
environment.getProperty("spring.jpa.properties.hibernate.dialect"));

localSessionFactoryBean.setHibernateProperties(properties);
localSessionFactoryBean.setPackagesToScan("mate.academy.spring.model");
return localSessionFactoryBean;
}
}
10 changes: 10 additions & 0 deletions src/main/java/mate/academy/spring/dao/UserDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package mate.academy.spring.dao;

import java.util.List;
import mate.academy.spring.model.User;

public interface UserDao {
User add(User user);

List<User> getAll();
}
51 changes: 51 additions & 0 deletions src/main/java/mate/academy/spring/dao/impl/UserDaoImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package mate.academy.spring.dao.impl;

import java.util.List;
import mate.academy.spring.dao.UserDao;
import mate.academy.spring.exception.DataProcessingException;
import mate.academy.spring.model.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class UserDaoImpl implements UserDao {

@Autowired
private SessionFactory sessionFactory;

@Override
public User add(User user) {
Transaction transaction = null;
Session session = null;
try {
session = sessionFactory.openSession();
transaction = session.beginTransaction();
session.save(user);
transaction.commit();
return user;
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
throw new DataProcessingException("Can't insert an user: " + user, e);
} finally {
if (session != null) {
session.close();
}
}
}

@Override
public List<User> getAll() {
try (Session session = sessionFactory.openSession()) {
Query<User> query = session.createQuery("FROM User", User.class);
return query.getResultList();
} catch (Exception e) {
throw new DataProcessingException("Can't get all users", e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package mate.academy.spring.exception;

public class DataProcessingException extends RuntimeException {
public DataProcessingException(String message, Throwable cause) {
super(message, cause);
}
}
41 changes: 41 additions & 0 deletions src/main/java/mate/academy/spring/model/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package mate.academy.spring.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.Objects;

@Getter
@Setter
@ToString
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
User user = (User) o;
return age == user.age && Objects.equals(id, user.id) && name.equals(user.name);
}

@Override
public int hashCode() {
return Objects.hash(id, name, age);
}
}
10 changes: 10 additions & 0 deletions src/main/java/mate/academy/spring/service/UserService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package mate.academy.spring.service;

import java.util.List;
import mate.academy.spring.model.User;

public interface UserService {
User add(User user);

List<User> getAll();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package mate.academy.spring.service.impl;

import java.util.List;
import mate.academy.spring.dao.UserDao;
import mate.academy.spring.model.User;
import mate.academy.spring.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserDao userDao;

@Override
public User add(User user) {
return userDao.add(user);
}

@Override
public List<User> getAll() {
return userDao.getAll();
}
}
8 changes: 8 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/spring_app?serverTimezone=UTC
db.username=root
db.password=root

hibernate.show_sql=true
hibernate.hbm2_ddl.auto=create-drop
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect
64 changes: 64 additions & 0 deletions src/test/java/mate/academy/spring/dao/UserDaoTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package mate.academy.spring.dao;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.util.Collections;
import java.util.List;
import mate.academy.spring.config.AppConfig;
import mate.academy.spring.model.User;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
@TestPropertySource(locations="classpath:application.properties")
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
public class UserDaoTest {
private static UserDao userDao;

@BeforeClass
public static void setUp() {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
userDao = context.getBean(UserDao.class);
}

@Test
public void add_Ok() {
User user = createUser("John", 18);
assertNotNull(user.getId());
long expected = 1L;
long actual = user.getId();
assertEquals(expected, actual);
}

@Test
public void getAll_NoUsers_Ok() {
List<User> expected = Collections.emptyList();
List<User> actual = userDao.getAll();
assertEquals(expected, actual);
}

@Test
public void getAll_WithUsers_Ok() {
User john = createUser("John", 18);
User ann = createUser("Ann", 20);
List<User> expected = List.of(john, ann);
List<User> actual = userDao.getAll();
assertEquals(expected, actual);
}

private User createUser(String name, int age) {
User user = new User();
user.setName(name);
user.setAge(age);
return userDao.add(user);
}
}
Loading

0 comments on commit 36e745b

Please sign in to comment.