2 Commits
hw2 ... hw3

Author SHA1 Message Date
9c38800214 hw3 2018-10-07 19:23:56 +03:00
e8260b1700 start hw3 2018-10-07 16:23:51 +03:00
7 changed files with 146 additions and 19 deletions

View File

@@ -1,6 +1,7 @@
plugins { plugins {
id 'war' id 'war'
id 'org.gretty' version '2.2.0' id 'org.gretty' version '2.2.0'
id 'io.franzbecker.gradle-lombok' version '1.14'
} }
repositories { repositories {
@@ -11,9 +12,19 @@ repositories {
sourceCompatibility = 10 sourceCompatibility = 10
dependencies { dependencies {
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.7'
compile 'com.fasterxml.jackson.core:jackson-databind:2.9.6'
compileOnly 'javax.servlet:javax.servlet-api:4.0.1' compileOnly 'javax.servlet:javax.servlet-api:4.0.1'
} }
gretty { gretty {
contextPath = '/' contextPath = '/'
} }
lombok {
version = '1.18.2'
sha256 = ""
}

View File

@@ -0,0 +1,10 @@
package DTO;
import lombok.Data;
import java.util.List;
public @Data class Order {
private int id;
private String orderNumber;
private List<OrderItem> orderRows;
}

View File

@@ -0,0 +1,9 @@
package DTO;
import lombok.Data;
public @Data class OrderItem {
private String itemName;
private Integer quantity;
private Integer price;
}

View File

@@ -1,42 +1,72 @@
package api; package api;
import DTO.Order;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebListener;
import javax.servlet.annotation.WebServlet; import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.regex.Matcher; import java.util.HashMap;
import java.util.regex.Pattern; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@WebServlet("/api/orders") @WebServlet(urlPatterns = "/api/orders", name="Orders")
public class Orders extends HttpServlet { @WebListener
public class Orders extends HttpServlet implements ServletContextListener {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private int lastOrderId = 0; private static int nextOrderId = 0;
private Pattern orderPattern = Pattern.compile(".*\"orderNumber\":\\s*\"(.*)\".*"); 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 @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().format("%d", lastOrderId); String idString = req.getParameter("id");
if (idString != null) {
int id = Integer.parseInt(idString);
Order order = (Order) orders.get(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());
} }
@Override @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/json"); resp.setContentType("application/json");
String order = req.getReader().lines().collect(Collectors.joining(" ")); String orderJson = req.getReader().lines().collect(Collectors.joining(" "));
int orderId = lastOrderId++;
Matcher matcher = orderPattern.matcher(order);
boolean matches = matcher.matches();
if (matches && matcher.groupCount() > 0) { Order order = new ObjectMapper().readValue(orderJson, Order.class);
String orderNumber = matcher.group(1); addOrder(order);
System.out.format("request data: %s, orderNumber: %s\n", order, orderNumber); resp.getWriter().print(new ObjectMapper().writeValueAsString(order));
resp.getWriter().printf("{\"id\": %d, \"orderNumber\": \"%s\"}", orderId, orderNumber);
} else {
resp.getWriter().print("\"Invalid request\"");
}
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// fixme horrible hack
sce.getServletContext().setAttribute("Orders", this);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
} }
} }

View File

@@ -0,0 +1,17 @@
package form;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/", name="Index")
public class Index extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
response.getWriter().print("<a href=/orders/form>Orders form</a>");
}
}

View File

@@ -0,0 +1,50 @@
package form;
import DTO.Order;
import api.Orders;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/orders/form", name="OrdersForm")
public class OrdersForm extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
resp.getWriter().print(
"<form method=post>" +
"<label for=orderNumber>Order Number</label> " +
"<input type=text name=orderNumber></input> " +
"<input type=submit></input>" +
"</form>"
);
}
@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");
resp.getWriter().print("orderNumber parameter is empty");
return;
}
Order order = new Order();
order.setOrderNumber(orderNumber);
int orderId = orders.addOrder(order);
resp.getWriter().format("%d", orderId);
}
}

View File

@@ -7,7 +7,7 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello") @WebServlet(urlPatterns = "/hello", name="Hello")
public class HelloServlet extends HttpServlet { public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;