hw4
This commit is contained in:
@@ -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'
|
||||
|
||||
|
||||
81
src/main/java/DAO/OrdersDao.java
Normal file
81
src/main/java/DAO/OrdersDao.java
Normal file
@@ -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<Order> getAllOrders() {
|
||||
List<Order> orders = new ArrayList<Order>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
39
src/main/java/Startup.java
Normal file
39
src/main/java/Startup.java
Normal file
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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<Integer, Order>();
|
||||
|
||||
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<Order> 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) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
35
src/main/java/util/DataSourceProvider.java
Normal file
35
src/main/java/util/DataSourceProvider.java
Normal file
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
4
src/main/resources/sql/schema.sql
Normal file
4
src/main/resources/sql/schema.sql
Normal file
@@ -0,0 +1,4 @@
|
||||
CREATE TABLE orders (
|
||||
id BIGINT NOT NULL PRIMARY KEY ,
|
||||
order_number VARCHAR (255)
|
||||
);
|
||||
Reference in New Issue
Block a user