diff --git a/pom.xml b/pom.xml
index a043c369c..cfcf51812 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
mysql
mysql-connector-java
- 8.0.22
+ 8.0.33
javax.servlet
diff --git a/src/main/java/taxi/controller/LoginController.java b/src/main/java/taxi/controller/LoginController.java
new file mode 100644
index 000000000..813745c3c
--- /dev/null
+++ b/src/main/java/taxi/controller/LoginController.java
@@ -0,0 +1,41 @@
+package taxi.controller;
+
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import taxi.exception.AuthenticationException;
+import taxi.lib.Injector;
+import taxi.model.Driver;
+import taxi.service.AuthenticationService;
+
+public class LoginController extends HttpServlet {
+ private static final Injector injector = Injector.getInstance("taxi");
+ private final AuthenticationService authenticationService =
+ (AuthenticationService) injector.getInstance(AuthenticationService.class);
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ req.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(req, resp);
+ }
+
+ @Override
+ protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ String login = req.getParameter("login");
+ String password = req.getParameter("password");
+
+ try {
+ Driver driver = authenticationService.login(login, password);
+ HttpSession session = req.getSession();
+ session.setAttribute("driver_id", driver.getId());
+ resp.sendRedirect(req.getContextPath() + "/index");
+ } catch (AuthenticationException e) {
+ req.setAttribute("errorMsg", e.getMessage());
+ req.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(req, resp);
+ }
+ }
+}
diff --git a/src/main/java/taxi/controller/LogoutController.java b/src/main/java/taxi/controller/LogoutController.java
new file mode 100644
index 000000000..db34f6309
--- /dev/null
+++ b/src/main/java/taxi/controller/LogoutController.java
@@ -0,0 +1,16 @@
+package taxi.controller;
+
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class LogoutController extends HttpServlet {
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ req.getSession().invalidate();
+ resp.sendRedirect(req.getContextPath() + "/login");
+ }
+}
diff --git a/src/main/java/taxi/controller/car/AddDriverToCarController.java b/src/main/java/taxi/controller/car/AddDriverToCarController.java
index 9b2aa76ca..698b04dee 100644
--- a/src/main/java/taxi/controller/car/AddDriverToCarController.java
+++ b/src/main/java/taxi/controller/car/AddDriverToCarController.java
@@ -18,8 +18,7 @@ public class AddDriverToCarController extends HttpServlet {
.getInstance(DriverService.class);
@Override
- public void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
+ public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/views/cars/drivers/add.jsp").forward(req, resp);
}
diff --git a/src/main/java/taxi/controller/car/GetMyCurrentCarsController.java b/src/main/java/taxi/controller/car/GetMyCurrentCarsController.java
new file mode 100644
index 000000000..71e7b7586
--- /dev/null
+++ b/src/main/java/taxi/controller/car/GetMyCurrentCarsController.java
@@ -0,0 +1,28 @@
+package taxi.controller.car;
+
+import java.io.IOException;
+import java.util.List;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import taxi.lib.Injector;
+import taxi.model.Car;
+import taxi.service.CarService;
+import taxi.service.DriverService;
+
+public class GetMyCurrentCarsController extends HttpServlet {
+ private static final Injector injector = Injector.getInstance("taxi");
+ private final DriverService driverService =
+ (DriverService) injector.getInstance(DriverService.class);
+ private final CarService carService = (CarService) injector.getInstance(CarService.class);
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ Long driverId = (Long) req.getSession().getAttribute("driver_id");
+ List allCarsByDriver = carService.getAllByDriver(driverId);
+ req.setAttribute("cars", allCarsByDriver);
+ req.getRequestDispatcher("/WEB-INF/views/cars/all.jsp").forward(req, resp);
+ }
+}
diff --git a/src/main/java/taxi/controller/driver/AddDriverController.java b/src/main/java/taxi/controller/driver/AddDriverController.java
index 1db67730b..e6da4dd22 100644
--- a/src/main/java/taxi/controller/driver/AddDriverController.java
+++ b/src/main/java/taxi/controller/driver/AddDriverController.java
@@ -24,7 +24,9 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp)
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String name = req.getParameter("name");
String licenseNumber = req.getParameter("license_number");
- Driver driver = new Driver(name, licenseNumber);
+ String login = req.getParameter("login");
+ String password = req.getParameter("password");
+ Driver driver = new Driver(name, licenseNumber, login, password);
driverService.create(driver);
resp.sendRedirect(req.getContextPath() + "/drivers/add");
}
diff --git a/src/main/java/taxi/dao/CarDaoImpl.java b/src/main/java/taxi/dao/CarDaoImpl.java
index 586ccb595..51ae87505 100644
--- a/src/main/java/taxi/dao/CarDaoImpl.java
+++ b/src/main/java/taxi/dao/CarDaoImpl.java
@@ -134,7 +134,7 @@ public List getAllByDriver(Long driverId) {
+ "m.country AS manufacturer_country "
+ "FROM cars c"
+ " JOIN manufacturers m ON c.manufacturer_id = m.id"
- + " JOIN cars_drivers cd ON c.id = cd.car_id"
+ + " JOIN drivers_cars cd ON c.id = cd.car_id"
+ " JOIN drivers d ON cd.driver_id = d.id"
+ " WHERE c.is_deleted = FALSE AND driver_id = ?"
+ " AND d.is_deleted = FALSE";
@@ -160,7 +160,7 @@ private void insertAllDrivers(Car car) {
if (drivers.size() == 0) {
return;
}
- String query = "INSERT INTO cars_drivers (car_id, driver_id) VALUES (?, ?)";
+ String query = "INSERT INTO drivers_cars (car_id, driver_id) VALUES (?, ?)";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement =
connection.prepareStatement(query)) {
@@ -175,7 +175,7 @@ private void insertAllDrivers(Car car) {
}
private void deleteAllDrivers(Car car) {
- String query = "DELETE FROM cars_drivers WHERE car_id = ?";
+ String query = "DELETE FROM drivers_cars WHERE car_id = ?";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement =
connection.prepareStatement(query)) {
@@ -188,8 +188,8 @@ private void deleteAllDrivers(Car car) {
}
private List getAllDriversByCarId(Long carId) {
- String query = "SELECT id, name, license_number "
- + "FROM cars_drivers cd "
+ String query = "SELECT id, name, license_number, login, password "
+ + "FROM drivers_cars cd "
+ "JOIN drivers d ON cd.driver_id = d.id "
+ "WHERE car_id = ? AND is_deleted = false";
try (Connection connection = ConnectionUtil.getConnection();
@@ -211,10 +211,10 @@ private Driver parseDriverFromResultSet(ResultSet resultSet) throws SQLException
Long driverId = resultSet.getObject("id", Long.class);
String name = resultSet.getString("name");
String licenseNumber = resultSet.getString("license_number");
- Driver driver = new Driver();
+ String login = resultSet.getString("login");
+ String password = resultSet.getString("password");
+ Driver driver = new Driver(name, licenseNumber, login, password);
driver.setId(driverId);
- driver.setName(name);
- driver.setLicenseNumber(licenseNumber);
return driver;
}
diff --git a/src/main/java/taxi/dao/DriverDao.java b/src/main/java/taxi/dao/DriverDao.java
index 83440d530..e9c38d2a5 100644
--- a/src/main/java/taxi/dao/DriverDao.java
+++ b/src/main/java/taxi/dao/DriverDao.java
@@ -1,6 +1,8 @@
package taxi.dao;
+import java.util.Optional;
import taxi.model.Driver;
public interface DriverDao extends GenericDao {
+ Optional findByLogin(String login);
}
diff --git a/src/main/java/taxi/dao/DriverDaoImpl.java b/src/main/java/taxi/dao/DriverDaoImpl.java
index f5e18f2a2..55d5fa266 100644
--- a/src/main/java/taxi/dao/DriverDaoImpl.java
+++ b/src/main/java/taxi/dao/DriverDaoImpl.java
@@ -17,13 +17,15 @@
public class DriverDaoImpl implements DriverDao {
@Override
public Driver create(Driver driver) {
- String query = "INSERT INTO drivers (name, license_number) "
- + "VALUES (?, ?)";
+ String query = "INSERT INTO drivers (name, license_number, login, password) "
+ + "VALUES (?, ?, ?, ?)";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(query,
Statement.RETURN_GENERATED_KEYS)) {
statement.setString(1, driver.getName());
statement.setString(2, driver.getLicenseNumber());
+ statement.setString(3, driver.getLogin());
+ statement.setString(4, driver.getPassword());
statement.executeUpdate();
ResultSet resultSet = statement.getGeneratedKeys();
if (resultSet.next()) {
@@ -72,13 +74,16 @@ public List getAll() {
public Driver update(Driver driver) {
String query = "UPDATE drivers "
+ "SET name = ?, license_number = ? "
+ + ", login = ?, password = ? "
+ "WHERE id = ? AND is_deleted = FALSE";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement
= connection.prepareStatement(query)) {
statement.setString(1, driver.getName());
statement.setString(2, driver.getLicenseNumber());
- statement.setLong(3, driver.getId());
+ statement.setString(3, driver.getLogin());
+ statement.setString(4, driver.getPassword());
+ statement.setLong(5, driver.getId());
statement.executeUpdate();
return driver;
} catch (SQLException e) {
@@ -98,14 +103,31 @@ public boolean delete(Long id) {
}
}
+ @Override
+ public Optional findByLogin(String login) {
+ String query = "SELECT id, name, license_number, login, password "
+ + "FROM drivers WHERE login = ? AND is_deleted = FALSE;";
+ try (Connection connection = ConnectionUtil.getConnection();
+ PreparedStatement preparedStatement = connection.prepareStatement(query)) {
+ preparedStatement.setString(1, login);
+ ResultSet resultSet = preparedStatement.executeQuery();
+ while (resultSet.next()) {
+ return Optional.of(parseDriverFromResultSet(resultSet));
+ }
+ } catch (SQLException e) {
+ throw new DataProcessingException("Can't get driver by login " + login, e);
+ }
+ return Optional.empty();
+ }
+
private Driver parseDriverFromResultSet(ResultSet resultSet) throws SQLException {
Long id = resultSet.getObject("id", Long.class);
String name = resultSet.getString("name");
String licenseNumber = resultSet.getString("license_number");
- Driver driver = new Driver();
+ String login = resultSet.getString("login");
+ String password = resultSet.getString("password");
+ Driver driver = new Driver(name, licenseNumber, login, password);
driver.setId(id);
- driver.setName(name);
- driver.setLicenseNumber(licenseNumber);
return driver;
}
}
diff --git a/src/main/java/taxi/exception/AuthenticationException.java b/src/main/java/taxi/exception/AuthenticationException.java
new file mode 100644
index 000000000..a80dfd9e9
--- /dev/null
+++ b/src/main/java/taxi/exception/AuthenticationException.java
@@ -0,0 +1,7 @@
+package taxi.exception;
+
+public class AuthenticationException extends Exception {
+ public AuthenticationException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/taxi/model/Driver.java b/src/main/java/taxi/model/Driver.java
index 9c375f94c..0e5fa9347 100644
--- a/src/main/java/taxi/model/Driver.java
+++ b/src/main/java/taxi/model/Driver.java
@@ -6,13 +6,14 @@ public class Driver {
private Long id;
private String name;
private String licenseNumber;
+ private String login;
+ private String password;
- public Driver() {
- }
-
- public Driver(String name, String licenseNumber) {
+ public Driver(String name, String licenseNumber, String login, String password) {
this.name = name;
this.licenseNumber = licenseNumber;
+ this.login = login;
+ this.password = password;
}
public Long getId() {
@@ -39,6 +40,24 @@ public void setLicenseNumber(String licenseNumber) {
this.licenseNumber = licenseNumber;
}
+ public String getLogin() {
+ return login;
+ }
+
+ public Driver setLogin(String login) {
+ this.login = login;
+ return this;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public Driver setPassword(String password) {
+ this.password = password;
+ return this;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {
@@ -55,6 +74,6 @@ public boolean equals(Object o) {
@Override
public int hashCode() {
- return Objects.hash(id, name, licenseNumber);
+ return Objects.hash(id, name, licenseNumber, login);
}
}
diff --git a/src/main/java/taxi/service/AuthenticationService.java b/src/main/java/taxi/service/AuthenticationService.java
new file mode 100644
index 000000000..e9ffa0eea
--- /dev/null
+++ b/src/main/java/taxi/service/AuthenticationService.java
@@ -0,0 +1,8 @@
+package taxi.service;
+
+import taxi.exception.AuthenticationException;
+import taxi.model.Driver;
+
+public interface AuthenticationService {
+ Driver login(String login, String password) throws AuthenticationException;
+}
diff --git a/src/main/java/taxi/service/AuthenticationServiceImpl.java b/src/main/java/taxi/service/AuthenticationServiceImpl.java
new file mode 100644
index 000000000..7d2b110ed
--- /dev/null
+++ b/src/main/java/taxi/service/AuthenticationServiceImpl.java
@@ -0,0 +1,22 @@
+package taxi.service;
+
+import java.util.Optional;
+import taxi.exception.AuthenticationException;
+import taxi.lib.Inject;
+import taxi.lib.Service;
+import taxi.model.Driver;
+
+@Service
+public class AuthenticationServiceImpl implements AuthenticationService {
+ @Inject
+ private DriverService driverService;
+
+ @Override
+ public Driver login(String login, String password) throws AuthenticationException {
+ Optional driverDaoByLogin = driverService.findByLogin(login);
+ if (password.equals(driverDaoByLogin.get().getPassword())) {
+ return driverDaoByLogin.get();
+ }
+ throw new AuthenticationException("Login or Password is incorrect.");
+ }
+}
diff --git a/src/main/java/taxi/service/DriverService.java b/src/main/java/taxi/service/DriverService.java
index faddf81b3..3dbdfe2f3 100644
--- a/src/main/java/taxi/service/DriverService.java
+++ b/src/main/java/taxi/service/DriverService.java
@@ -1,6 +1,8 @@
package taxi.service;
+import java.util.Optional;
import taxi.model.Driver;
public interface DriverService extends GenericService {
+ Optional findByLogin(String login);
}
diff --git a/src/main/java/taxi/service/DriverServiceImpl.java b/src/main/java/taxi/service/DriverServiceImpl.java
index e2f554b3f..cf14b8e39 100644
--- a/src/main/java/taxi/service/DriverServiceImpl.java
+++ b/src/main/java/taxi/service/DriverServiceImpl.java
@@ -2,6 +2,7 @@
import java.util.List;
import java.util.NoSuchElementException;
+import java.util.Optional;
import taxi.dao.DriverDao;
import taxi.lib.Inject;
import taxi.lib.Service;
@@ -38,4 +39,9 @@ public Driver update(Driver driver) {
public boolean delete(Long id) {
return driverDao.delete(id);
}
+
+ @Override
+ public Optional findByLogin(String login) {
+ return driverDao.findByLogin(login);
+ }
}
diff --git a/src/main/java/taxi/util/ConnectionUtil.java b/src/main/java/taxi/util/ConnectionUtil.java
index 9a94e69a2..4092f1542 100644
--- a/src/main/java/taxi/util/ConnectionUtil.java
+++ b/src/main/java/taxi/util/ConnectionUtil.java
@@ -6,10 +6,10 @@
import java.util.Properties;
public class ConnectionUtil {
- private static final String URL = "YOUR DATABASE URL";
- private static final String USERNAME = "YOUR USERNAME";
- private static final String PASSWORD = "YOUR PASSWORD";
- private static final String JDBC_DRIVER = "YOUR DRIVER";
+ private static final String URL = "jdbc:mysql://localhost:3306/taxi_service_db";
+ private static final String USERNAME = "root";
+ private static final String PASSWORD = "Password";
+ private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static {
try {
diff --git a/src/main/java/taxi/webfilter/AuthenticationFilter.java b/src/main/java/taxi/webfilter/AuthenticationFilter.java
new file mode 100644
index 000000000..2be319f33
--- /dev/null
+++ b/src/main/java/taxi/webfilter/AuthenticationFilter.java
@@ -0,0 +1,42 @@
+package taxi.webfilter;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+public class AuthenticationFilter implements Filter {
+ private final Set allowedUrls = new HashSet<>();
+
+ @Override
+ public void init(FilterConfig filterConfig) {
+ allowedUrls.add("/login");
+ allowedUrls.add("/registration");
+ allowedUrls.add("/help");
+ allowedUrls.add("/contacts");
+ allowedUrls.add("/drivers/add");
+ }
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+ throws IOException, ServletException {
+ HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+ HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+ HttpSession session = httpServletRequest.getSession();
+
+ Long userId = (Long) session.getAttribute("driver_id");
+ if (userId == null && !allowedUrls.contains(httpServletRequest.getServletPath())) {
+ httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login");
+ return;
+ }
+ chain.doFilter(httpServletRequest, httpServletResponse);
+ }
+}
diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql
index 2acabb883..8885d9e52 100644
--- a/src/main/resources/init_db.sql
+++ b/src/main/resources/init_db.sql
@@ -45,7 +45,7 @@ CREATE TABLE `cars` (
-- Table structure for cars_drivers
-- ----------------------------
DROP TABLE IF EXISTS `cars_drivers`;
-CREATE TABLE `cars_drivers` (
+CREATE TABLE `drivers_cars` (
`car_id` BIGINT(0) UNSIGNED NOT NULL,
`driver_id` BIGINT(0) UNSIGNED NOT NULL,
PRIMARY KEY (`car_id`, `driver_id`) USING BTREE,
@@ -56,3 +56,7 @@ CREATE TABLE `cars_drivers` (
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
+
+ALTER TABLE drivers
+ ADD login VARCHAR(255) NOT NULL,
+ ADD password VARCHAR(255) NOT NULL;
diff --git a/src/main/webapp/WEB-INF/views/cars/add.jsp b/src/main/webapp/WEB-INF/views/cars/add.jsp
index c23ba0b4f..e07525625 100644
--- a/src/main/webapp/WEB-INF/views/cars/add.jsp
+++ b/src/main/webapp/WEB-INF/views/cars/add.jsp
@@ -8,6 +8,7 @@
Add car
+<%@include file="/WEB-INF/views/header.jsp"%>
Add car: