package Store; import Server.JSONMessage; import Server.SocketServer; import UI.MainWindow; import com.corundumstudio.socketio.listener.DataListener; import java.sql.*; import java.util.ArrayList; import java.util.Map; public class Book { private int id; private String title; private String author; private int issuedBy; private String issuedByName = ""; public Book(int id) { this.id = id; } public Book(String title, String author) { this.title = title; this.author = author; this.issuedBy = 0; // 0 means available since IDs start with 1 } public Book(int id, String title, String author, int issuedBy, String issuedByName) { this.id = id; this.title = title; this.author = author; this.issuedBy = issuedBy; this.issuedByName = issuedByName; } public String getTitle() { return this.title; } public String getAuthor() { return this.author; } public int getIssuedBy() { return this.issuedBy; } public int getId() { return this.id; } public String getIssuedByName() { return issuedByName; } public int bookIssuedBy() throws SQLException { String sql = "SELECT issuedBy from Book where ID = " + this.id; Statement statement = ConnectionHandler.connection.createStatement(); ResultSet response = statement.executeQuery(sql); while (response.next()) { return response.getInt("issuedBy"); } return 0; } public boolean issue(int userId) throws SQLException { if (bookIssuedBy() == 0) { String sql = "UPDATE Book SET issuedBy = ? where ID = ?"; PreparedStatement statement = ConnectionHandler.connection.prepareStatement(sql); statement.setInt(1, userId); statement.setInt(2, this.id); statement.executeUpdate(); ArrayList allBooks = Book.getAll(false); UI.Components.BooksList.refreshBooks(allBooks); if (MainWindow.serverStarted) { SocketServer.server.getBroadcastOperations().sendEvent("booksUpdated", allBooks); } return true; } return false; } public boolean returnBook(int userId) throws SQLException { if (bookIssuedBy() == userId) { String sql = "UPDATE Book SET issuedBy = 0 where ID = ?"; PreparedStatement statement = ConnectionHandler.connection.prepareStatement(sql); statement.setInt(1, this.id); statement.executeUpdate(); ArrayList allBooks = Book.getAll(false); UI.Components.BooksList.refreshBooks(allBooks); if (MainWindow.serverStarted) { SocketServer.server.getBroadcastOperations().sendEvent("booksUpdated", allBooks); } return true; } return false; } public void save() throws SQLException { String sql = "INSERT INTO Book (title, author, issuedBy) VALUES (?, ?, ?)"; PreparedStatement statement = ConnectionHandler.connection.prepareStatement(sql); statement.setString(1, title); statement.setString(2, author); statement.setInt(3, issuedBy); statement.executeUpdate(); ArrayList allBooks = Book.getAll(false); UI.Components.BooksList.refreshBooks(allBooks); if (MainWindow.serverStarted) { SocketServer.server.getBroadcastOperations().sendEvent("booksUpdated", allBooks); } } public void delete() throws SQLException { String sql = "DELETE FROM Book WHERE ID = ?"; PreparedStatement statement = ConnectionHandler.connection.prepareStatement(sql); statement.setInt(1, this.id); statement.executeUpdate(); ArrayList allBooks = Book.getAll(false); UI.Components.BooksList.refreshBooks(allBooks); if (MainWindow.serverStarted) { SocketServer.server.getBroadcastOperations().sendEvent("booksUpdated", allBooks); } } public static ArrayList getAll(boolean availableOnly) throws SQLException { ArrayList books = new ArrayList<>(); String sql; if (availableOnly) { sql = "SELECT * FROM Book WHERE issuedBy = 0"; } else { sql = "SELECT Book.ID, Book.title, Book.issuedBy, Book.author, " + "User.userName FROM Book LEFT JOIN User ON User.ID = Book.issuedBy"; } Statement statement = ConnectionHandler.connection.createStatement(); ResultSet response = statement.executeQuery(sql); while (response.next()) { books.add(new Book(response.getInt("ID"), response.getString("title"), response.getString("author"), response.getInt("issuedBy"), response.getString("userName"))); } return books; } public static DataListener getListHandler(boolean availableOnly) { return ((client, data, ackSender) -> { Thread t = new Thread(() -> { ArrayList books = null; try { books = getAll(availableOnly); } catch (SQLException e) { throw new RuntimeException(e); } client.sendEvent(availableOnly ? "availableBooksList" : "allBooksList", books); }); t.start(); t.join(); }); } public static DataListener issueHandler() { return ((client, data, ackSender) -> { Thread t = new Thread(() -> { Map d = data.getData(); int userId = (int) d.get("id"); Book b = new Book((int) d.get("bookId")); try { if (b.issue(userId)) { client.sendEvent("issued"); } else { client.sendEvent("alreadyIssued"); } } catch (SQLException e) { throw new RuntimeException(e); } }); t.start(); t.join(); }); } public static DataListener returnHandler() { return ((client, data, ackSender) -> { Thread t = new Thread(() -> { Map d = data.getData(); int userId = (int) d.get("id"); Book b = new Book((int) d.get("bookId")); try { if (b.returnBook(userId)) { client.sendEvent("returned"); } else { client.sendEvent("returnFailed"); } } catch (SQLException e) { throw new RuntimeException(e); } }); t.start(); t.join(); }); } public static void createTable() throws SQLException { String sql = "CREATE TABLE IF NOT EXISTS Book (" + "ID INTEGER NOT NULL PRIMARY KEY, " + "title TEXT NOT NULL, " + "author text NOT NULL, " + "issuedBy INTEGER NOT NULL," + "FOREIGN KEY(issuedBy) REFERENCES User(ID)" + ");"; Statement statement = ConnectionHandler.connection.createStatement(); statement.execute(sql); } }