From b0a4a279281da5c57046ea99ae69706a26e97337 Mon Sep 17 00:00:00 2001 From: Arti Zirk Date: Sun, 14 Oct 2018 20:37:46 +0300 Subject: [PATCH] hw4 --- build.gradle | 6 ++ src/main/java/DAO/OrdersDao.java | 81 ++++++++++++++++++++++ src/main/java/Startup.java | 39 +++++++++++ src/main/java/servlet/api/Orders.java | 35 +++------- src/main/java/servlet/html/OrdersForm.java | 11 +-- src/main/java/util/DataSourceProvider.java | 35 ++++++++++ src/main/resources/sql/schema.sql | 4 ++ 7 files changed, 176 insertions(+), 35 deletions(-) create mode 100644 src/main/java/DAO/OrdersDao.java create mode 100644 src/main/java/Startup.java create mode 100644 src/main/java/util/DataSourceProvider.java create mode 100644 src/main/resources/sql/schema.sql diff --git a/build.gradle b/build.gradle index ade5ee0..b3598c1 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,12 @@ repositories { sourceCompatibility = 10 dependencies { + // https://mvnrepository.com/artifact/org.hsqldb/hsqldb + compile group: 'org.hsqldb', name: 'hsqldb', version: '2.4.1' + + // https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 + compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.5.0' + // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.7' diff --git a/src/main/java/DAO/OrdersDao.java b/src/main/java/DAO/OrdersDao.java new file mode 100644 index 0000000..1e4a768 --- /dev/null +++ b/src/main/java/DAO/OrdersDao.java @@ -0,0 +1,81 @@ +package DAO; + +import DTO.Order; +import util.DataSourceProvider; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class OrdersDao { + + static private int nextOrderId = 0; + + public static Order getOrderForId(int id) { + Order order = new Order(); + String sql = "select 'order_number' from ORDERS where id=?;"; + try (Connection connection = DataSourceProvider.getDataSource().getConnection(); + PreparedStatement ps = connection.prepareStatement(sql)) { + ps.setInt(1, id); + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + order.setId(id); + order.setOrderNumber(rs.getString("order_number")); + return order; + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return null; + } + public static List getAllOrders() { + List orders = new ArrayList(); + String sql = "select id, order_number from orders;"; + try (Connection connection = DataSourceProvider.getDataSource().getConnection(); + Statement statement = connection.createStatement() ){ + + try (ResultSet rs = statement.executeQuery(sql)) { + while(rs.next()) { + Order order = new Order(); + order.setId(rs.getInt(1)); + order.setOrderNumber(rs.getString(2)); + orders.add(order); + } + } + + } catch (SQLException e) { + e.printStackTrace(); + } + + return orders; + } + + public static void saveOrder(Order order) { + order.setId(nextOrderId++); + String sql = "insert into orders (id, order_number) values (?, ?);"; + try (Connection connection = DataSourceProvider.getDataSource().getConnection(); + PreparedStatement ps = connection.prepareStatement(sql)) { + ps.setInt(1, order.getId()); + ps.setString(2, order.getOrderNumber()); + ps.execute(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public static int getCount() { + String sql = "select count(*) from orders;"; + try (Connection connection = DataSourceProvider.getDataSource().getConnection(); + Statement ps = connection.createStatement()) { + try (ResultSet rs = ps.executeQuery(sql)) { + if (rs.next()) { + return rs.getInt(1); + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return 0; + } +} \ No newline at end of file diff --git a/src/main/java/Startup.java b/src/main/java/Startup.java new file mode 100644 index 0000000..8f04790 --- /dev/null +++ b/src/main/java/Startup.java @@ -0,0 +1,39 @@ +import util.DataSourceProvider; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; + +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; + +import static util.FileUtil.readFileFromClasspath; + +@WebListener +public class Startup implements ServletContextListener { + + @Override + public void contextInitialized(ServletContextEvent sce) { + System.out.println("Set jdbc provider url"); + DataSourceProvider.setDbUrl("jdbc:hsqldb:mem:shop."); + + System.out.println("Load sql"); + String sql = readFileFromClasspath("sql/schema.sql"); + + try (Connection connection = DataSourceProvider.getDataSource().getConnection(); + Statement statement = connection.createStatement()) { + + statement.execute(sql); + + } catch (SQLException e) { + throw new RuntimeException(e); + } + System.out.println("Ready"); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + + } +} diff --git a/src/main/java/servlet/api/Orders.java b/src/main/java/servlet/api/Orders.java index 67cc24e..a8d5448 100644 --- a/src/main/java/servlet/api/Orders.java +++ b/src/main/java/servlet/api/Orders.java @@ -1,5 +1,6 @@ package servlet.api; +import DAO.OrdersDao; import DTO.Order; import com.fasterxml.jackson.databind.ObjectMapper; @@ -13,39 +14,30 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.stream.Collectors; @WebServlet(urlPatterns = "/api/orders", name="Orders") -@WebListener -public class Orders extends HttpServlet implements ServletContextListener { +public class Orders extends HttpServlet { private static final long serialVersionUID = 1L; - private static int nextOrderId = 0; - private static Map orders = new HashMap(); - - public int addOrder(Order order) { - int orderId = nextOrderId; - nextOrderId++; - order.setId(orderId); - orders.put(orderId, order); - return orderId; - } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + resp.setContentType("application/json"); String idString = req.getParameter("id"); if (idString != null) { int id = Integer.parseInt(idString); - Order order = (Order) orders.get(id); + Order order = OrdersDao.getOrderForId(id); if (order == null) { resp.setStatus(404); return; } - resp.setContentType("application/json"); resp.getWriter().print(new ObjectMapper().writeValueAsString(order)); return; } - resp.getWriter().format("%s %d", getServletName(), orders.size()); + List orders = OrdersDao.getAllOrders(); + resp.getWriter().print(new ObjectMapper().writeValueAsString(orders)); } @Override @@ -54,19 +46,8 @@ public class Orders extends HttpServlet implements ServletContextListener { String orderJson = req.getReader().lines().collect(Collectors.joining(" ")); Order order = new ObjectMapper().readValue(orderJson, Order.class); - addOrder(order); + OrdersDao.saveOrder(order); resp.getWriter().print(new ObjectMapper().writeValueAsString(order)); } - - @Override - public void contextInitialized(ServletContextEvent sce) { - // fixme horrible hack - sce.getServletContext().setAttribute("Orders", this); - } - - @Override - public void contextDestroyed(ServletContextEvent sce) { - - } } diff --git a/src/main/java/servlet/html/OrdersForm.java b/src/main/java/servlet/html/OrdersForm.java index 0d7850b..558086d 100644 --- a/src/main/java/servlet/html/OrdersForm.java +++ b/src/main/java/servlet/html/OrdersForm.java @@ -1,5 +1,6 @@ package servlet.html; +import DAO.OrdersDao; import DTO.Order; import servlet.api.Orders; @@ -29,12 +30,6 @@ public class OrdersForm extends HttpServlet @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("application/json"); - // fixme horrible hack - Orders orders = (Orders) getServletContext().getAttribute("Orders"); - if (orders == null) { - throw new NullPointerException("Orders servlet not found"); - } - String orderNumber = req.getParameter("orderNumber"); if (orderNumber == null) { resp.setStatus(400, "orderNumber parameter is empty"); @@ -44,7 +39,7 @@ public class OrdersForm extends HttpServlet Order order = new Order(); order.setOrderNumber(orderNumber); - int orderId = orders.addOrder(order); - resp.getWriter().format("%d", orderId); + OrdersDao.saveOrder(order); + resp.getWriter().format("%d", order.getId()); } } diff --git a/src/main/java/util/DataSourceProvider.java b/src/main/java/util/DataSourceProvider.java new file mode 100644 index 0000000..91997f2 --- /dev/null +++ b/src/main/java/util/DataSourceProvider.java @@ -0,0 +1,35 @@ +package util; + +import org.apache.commons.dbcp2.BasicDataSource; + +import javax.sql.DataSource; + +public class DataSourceProvider { + + private static String dbUrl = null; + + private static BasicDataSource dataSource = null; + + public static void setDbUrl(String url) { + dbUrl = url; + } + + public static DataSource getDataSource() { + if (dataSource != null) { + return dataSource; + } + + if (dbUrl == null) { + throw new IllegalStateException( + "Database url not configured. Use setDbUrl()"); + } + + dataSource = new BasicDataSource(); + dataSource.setDriverClassName("org.hsqldb.jdbcDriver"); + dataSource.setUrl(dbUrl); + dataSource.setMaxTotal(3); + + return dataSource; + } + +} diff --git a/src/main/resources/sql/schema.sql b/src/main/resources/sql/schema.sql new file mode 100644 index 0000000..7214a5b --- /dev/null +++ b/src/main/resources/sql/schema.sql @@ -0,0 +1,4 @@ +CREATE TABLE orders ( +id BIGINT NOT NULL PRIMARY KEY , +order_number VARCHAR (255) +); \ No newline at end of file