diff --git a/src/main/java/ru/javawebinar/topjava/Profiles.java b/src/main/java/ru/javawebinar/topjava/Profiles.java index b2004c5..7d3fc96 100644 --- a/src/main/java/ru/javawebinar/topjava/Profiles.java +++ b/src/main/java/ru/javawebinar/topjava/Profiles.java @@ -15,5 +15,5 @@ public class Profiles { JDBC = "jdbc", JPA = "jpa"; - public static final String REPOSITORY_IMPLEMENTATION = JPA; + public static final String REPOSITORY_IMPLEMENTATION = JDBC; } diff --git a/src/main/java/ru/javawebinar/topjava/repository/datajpa/CrudMealRepository.java b/src/main/java/ru/javawebinar/topjava/repository/datajpa/CrudMealRepository.java index a365967..bf47d28 100644 --- a/src/main/java/ru/javawebinar/topjava/repository/datajpa/CrudMealRepository.java +++ b/src/main/java/ru/javawebinar/topjava/repository/datajpa/CrudMealRepository.java @@ -1,7 +1,35 @@ package ru.javawebinar.topjava.repository.datajpa; +import org.springframework.data.domain.Example; +import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.transaction.annotation.Transactional; import ru.javawebinar.topjava.model.Meal; +import java.time.LocalDateTime; +import java.util.List; + +@Transactional(readOnly = true) public interface CrudMealRepository extends JpaRepository { + + @Query("SELECT m FROM Meal m WHERE m.user.id=:userId ORDER BY m.dateTime DESC") + List findAllByUser(@Param("userId") int userId); + + @Transactional + @Override + Meal save(Meal entity); + + @Override + Meal findOne(Integer integer); + + @Transactional + @Modifying + @Query("DELETE from Meal m WHERE m.id = :id") + int delete(@Param("id") int id); + + @Query("SELECT m FROM Meal m WHERE m.user.id=:userId and m.dateTime BETWEEN :startDate AND :endDate ORDER BY m.dateTime DESC") + List findByUserIdBetweenDates(@Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate , @Param("userId") int userId); } diff --git a/src/main/java/ru/javawebinar/topjava/repository/datajpa/DataJpaMealRepositoryImpl.java b/src/main/java/ru/javawebinar/topjava/repository/datajpa/DataJpaMealRepositoryImpl.java index 1b00b26..98d166f 100644 --- a/src/main/java/ru/javawebinar/topjava/repository/datajpa/DataJpaMealRepositoryImpl.java +++ b/src/main/java/ru/javawebinar/topjava/repository/datajpa/DataJpaMealRepositoryImpl.java @@ -1,41 +1,65 @@ package ru.javawebinar.topjava.repository.datajpa; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import ru.javawebinar.topjava.model.Meal; +import ru.javawebinar.topjava.model.User; import ru.javawebinar.topjava.repository.MealRepository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; import java.time.LocalDateTime; import java.util.List; + @Repository public class DataJpaMealRepositoryImpl implements MealRepository { +private static final Logger LOG = LoggerFactory.getLogger(DataJpaMealRepositoryImpl.class); + { + LOG.info("DataJpaMealRepositoryImpl has started"); + } + @Autowired - private CrudMealRepository crudRepository; + private CrudMealRepository crudMealRepository; + + @Autowired + private DataJpaUserRepositoryImpl crudUserRepository; @Override - public Meal save(Meal Meal, int userId) { - return null; + public Meal save(Meal meal, int userId) { + if (!meal.isNew() && (get(meal.getId(), userId) == null)) { + return null; + } + + User user = crudUserRepository.get(userId); + meal.setUser(user); + + return crudMealRepository.save(meal); } @Override public boolean delete(int id, int userId) { - return false; + return crudMealRepository.delete(id) != 0; } @Override public Meal get(int id, int userId) { - return null; + Meal meal = crudMealRepository.findOne(id); + return meal != null && meal.getUser().getId() == userId ? meal : null; } @Override public List getAll(int userId) { - return null; + return crudMealRepository.findAllByUser(userId); } @Override public List getBetween(LocalDateTime startDate, LocalDateTime endDate, int userId) { - return null; + return crudMealRepository.findByUserIdBetweenDates(startDate, endDate, userId); } } diff --git a/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java b/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java index fa51465..eb7e4da 100644 --- a/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java +++ b/src/main/java/ru/javawebinar/topjava/repository/jdbc/JdbcMealRepositoryImpl.java @@ -1,5 +1,7 @@ package ru.javawebinar.topjava.repository.jdbc; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.support.DataAccessUtils; import org.springframework.jdbc.core.BeanPropertyRowMapper; @@ -18,6 +20,10 @@ @Repository public class JdbcMealRepositoryImpl implements MealRepository { + private static final Logger LOG = LoggerFactory.getLogger(JdbcMealRepositoryImpl.class); + { + LOG.info("JdbcMealRepositoryImpl has started"); + } private static final RowMapper ROW_MAPPER = BeanPropertyRowMapper.newInstance(Meal.class); diff --git a/src/main/java/ru/javawebinar/topjava/repository/jpa/JpaMealRepositoryImpl.java b/src/main/java/ru/javawebinar/topjava/repository/jpa/JpaMealRepositoryImpl.java index 200a2c0..61abec8 100644 --- a/src/main/java/ru/javawebinar/topjava/repository/jpa/JpaMealRepositoryImpl.java +++ b/src/main/java/ru/javawebinar/topjava/repository/jpa/JpaMealRepositoryImpl.java @@ -1,5 +1,7 @@ package ru.javawebinar.topjava.repository.jpa; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import ru.javawebinar.topjava.model.Meal; @@ -19,6 +21,10 @@ @Repository @Transactional(readOnly = true) public class JpaMealRepositoryImpl implements MealRepository { +private static final Logger LOG = LoggerFactory.getLogger(JpaMealRepositoryImpl.class); + { + LOG.info("JpaMealRepositoryImpl has started"); + } @PersistenceContext private EntityManager em; diff --git a/src/main/java/ru/javawebinar/topjava/web/MealServlet.java b/src/main/java/ru/javawebinar/topjava/web/MealServlet.java index 9e3cd16..a6714dc 100644 --- a/src/main/java/ru/javawebinar/topjava/web/MealServlet.java +++ b/src/main/java/ru/javawebinar/topjava/web/MealServlet.java @@ -2,6 +2,9 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.support.GenericXmlApplicationContext; +import org.springframework.core.env.ConfigurableEnvironment; +import ru.javawebinar.topjava.Profiles; import ru.javawebinar.topjava.model.Meal; import ru.javawebinar.topjava.util.DateTimeUtil; import ru.javawebinar.topjava.web.meal.MealRestController; @@ -20,13 +23,17 @@ public class MealServlet extends HttpServlet { - private ConfigurableApplicationContext springContext; + private GenericXmlApplicationContext springContext; private MealRestController mealController; @Override public void init(ServletConfig config) throws ServletException { super.init(config); - springContext = new ClassPathXmlApplicationContext("spring/spring-app.xml", "spring/spring-db.xml"); + springContext = new GenericXmlApplicationContext(); + ConfigurableEnvironment environment = springContext.getEnvironment(); +// environment.setActiveProfiles(Profiles.ACTIVE_DB, Profiles.REPOSITORY_IMPLEMENTATION); + springContext.load("spring/spring-app.xml","spring/spring-db.xml"); + springContext.refresh(); mealController = springContext.getBean(MealRestController.class); } diff --git a/src/main/resources/db/populateDB.sql b/src/main/resources/db/populateDB.sql index 0fbffd0..b3f5061 100644 --- a/src/main/resources/db/populateDB.sql +++ b/src/main/resources/db/populateDB.sql @@ -14,11 +14,11 @@ INSERT INTO user_roles (role, user_id) VALUES ('ROLE_ADMIN', 100001); INSERT INTO meals (date_time, description, calories, user_id) VALUES - ('2015-05-30 10:00:00', 'Завтрак', 500, 100000), - ('2015-05-30 13:00:00', 'Обед', 1000, 100000), - ('2015-05-30 20:00:00', 'Ужин', 500, 100000), - ('2015-05-31 10:00:00', 'Завтрак', 500, 100000), - ('2015-05-31 13:00:00', 'Обед', 1000, 100000), - ('2015-05-31 20:00:00', 'Ужин', 510, 100000), - ('2015-06-01 14:00:00', 'Админ ланч', 510, 100001), - ('2015-06-01 21:00:00', 'Админ ужин', 1500, 100001); + ('2017-05-30 10:00:00', 'Завтрак', 500, 100000), + ('2017-05-30 13:00:00', 'Обед', 1000, 100000), + ('2017-05-30 20:00:00', 'Ужин', 500, 100000), + ('2017-05-31 10:00:00', 'Завтрак', 500, 100000), + ('2017-05-31 13:00:00', 'Обед', 1000, 100000), + ('2017-05-31 20:00:00', 'Ужин', 510, 100000), + ('2017-06-01 14:00:00', 'Админ ланч', 510, 100001), + ('2017-06-01 21:00:00', 'Админ ужин', 1500, 100001); diff --git a/src/main/resources/spring/spring-db.xml b/src/main/resources/spring/spring-db.xml index a5fa0c6..13d6194 100644 --- a/src/main/resources/spring/spring-db.xml +++ b/src/main/resources/spring/spring-db.xml @@ -11,57 +11,13 @@ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -87,8 +43,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +