From ccfc9eaaed0b684590904d4831e91904d60cb420 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=AA=20Th=C3=A0nh=20=C4=90=E1=BA=A1t?= <91755733+lds217@users.noreply.github.com> Date: Mon, 13 Oct 2025 02:49:03 -0400 Subject: [PATCH] [update] Remove DebugFileWalk class and enhance CheckUpPage with image deletion functionality. Implement ping/pong mechanism for connection stability in ClientHandler and Server, and improve timeout management with IdleStateHandler adjustments. Update binary files for database and enhance Google Drive integration for image deletion. --- database/BSK.db-shm | Bin 32768 -> 32768 bytes database/BSK.db-wal | Bin 943512 -> 997072 bytes .../48/IMG_48_20251013_000936_631.jpg | Bin 0 -> 23629 bytes .../48/IMG_48_20251013_000937_904.jpg | Bin 0 -> 23802 bytes .../48/IMG_48_20251013_000939_184.jpg | Bin 0 -> 23329 bytes .../48/IMG_48_20251013_000940_386.jpg | Bin 0 -> 23540 bytes src/main/DebugFileWalk.java | 51 ------- src/main/java/BsK/client/Client.java | 7 +- .../client/network/handler/ClientHandler.java | 81 +++++++---- .../ui/component/CheckUpPage/CheckUpPage.java | 102 +++++++++++++- .../packet/req/DeleteCheckupImageRequest.java | 16 +++ .../BsK/common/packet/req/PingRequest.java | 10 +- .../res/DeleteCheckupImageResponse.java | 18 +++ .../BsK/common/packet/res/PongResponse.java | 18 +++ src/main/java/BsK/server/Server.java | 7 +- .../server/network/handler/ServerHandler.java | 133 ++++++++++++++++++ .../service/GoogleDriveServiceOAuth.java | 12 +- 17 files changed, 368 insertions(+), 87 deletions(-) create mode 100644 image/checkup_media/48/IMG_48_20251013_000936_631.jpg create mode 100644 image/checkup_media/48/IMG_48_20251013_000937_904.jpg create mode 100644 image/checkup_media/48/IMG_48_20251013_000939_184.jpg create mode 100644 image/checkup_media/48/IMG_48_20251013_000940_386.jpg delete mode 100644 src/main/DebugFileWalk.java create mode 100644 src/main/java/BsK/common/packet/req/DeleteCheckupImageRequest.java create mode 100644 src/main/java/BsK/common/packet/res/DeleteCheckupImageResponse.java create mode 100644 src/main/java/BsK/common/packet/res/PongResponse.java diff --git a/database/BSK.db-shm b/database/BSK.db-shm index 224e88b3b64b01f6c92085bfdc20fb4c435f018d..7e895a6a5e28c338e064bc56eaa8d391de67d3fe 100644 GIT binary patch delta 279 zcmZo@U}|V!s+V}A%K!pQK+MR%An*xDy8{^o+{e9(UPy}toOu!87ZCBi`Sz+7m5nP6 zNmUOr8w5b+{zn2}L6Eg?Ha5;?He?3!9f8(@Xkj3B0%Bz#Umb^-(`H2$Lz~HU4ib#d zfy{KK&HtRbm{?yiyl40X{0~_;8hIc@z`)mNMtx@9u delta 207 zcmZo@U}|V!s+V}A%K!t63=9HKfgE=rV`J_4JuB+=9SAt{BET;o;`@WpIKhL)9JfeS z4>KEN?tdfz6=!02y0LLK^X3p1Et|;+EEbdN93(aev1Bl9{^!)i1Y{L4PyXfM17xh@ g*!(3>L=?zsW8B=Ap~W>hh(&Gly&?xTpwJ^W0N+?iJ^%m! diff --git a/database/BSK.db-wal b/database/BSK.db-wal index 1146c84439d59321c25894812d85eee58e6a6c0e..189fb73b043aecc1d3555a311e7a03fde34adbe7 100644 GIT binary patch delta 1207 zcmbW0ZAep57{|}qoNc>1_sK+^#g*A6y{L6xHft4ORv3voQR!`9muLNh_sDIw@6}A?YQ9WRxh$B$1nRr%!%4NM`EOX03|uyL_Qs86G5UfEoE( zm&q+Z86!6N(>WuZxy!TJ*|cSehaiNsti5vGyf9jHl{L>=V?wBd%ca#WzGhB-OiH8hSsL~vhua!n)+bb+9H3j QY4w^-<=meh{M+Vy19Rz5j{pDw delta 37 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 ALL files and folders found by Files.walk():"); - try (Stream pathStream = Files.walk(mediaPath)) { - pathStream.forEach(path -> { - System.out.println(" -> Found: " + path); - }); - } catch (IOException e) { - System.err.println("An ERROR occurred during the scan:"); - e.printStackTrace(); - } - - System.out.println("\n--------------------------------"); - System.out.println(">>> Files that match the '.jpg' filter:"); - try (Stream pathStream = Files.walk(mediaPath)) { - pathStream - .filter(path -> !Files.isDirectory(path)) - .filter(path -> path.toString().toLowerCase().endsWith(".jpg")) - .forEach(path -> { - System.out.println(" -> Matched: " + path); - }); - } catch (IOException e) { - System.err.println("An ERROR occurred during the filtered scan:"); - e.printStackTrace(); - } - - System.out.println("\n--- Scan Finished ---"); - } -} \ No newline at end of file diff --git a/src/main/java/BsK/client/Client.java b/src/main/java/BsK/client/Client.java index 2d25915..76e696c 100644 --- a/src/main/java/BsK/client/Client.java +++ b/src/main/java/BsK/client/Client.java @@ -189,9 +189,10 @@ public class Client { true, new DefaultHttpHeaders(), 50 * 1024 * 1024)) - // Add IdleStateHandler with longer timeouts for network resilience - // Read timeout: 60 seconds, Write timeout: 30 seconds - .addLast(new IdleStateHandler(60, 30, 0)) + // Add IdleStateHandler for keep-alive and timeout detection + // Read timeout: 5 minutes (300s) - disconnect if no data from server + // Write timeout: 10 seconds - send ping if no data sent to server + .addLast(new IdleStateHandler(300, 10, 0)) .addLast("ws", ClientHandler.INSTANCE); } }); diff --git a/src/main/java/BsK/client/network/handler/ClientHandler.java b/src/main/java/BsK/client/network/handler/ClientHandler.java index 8c0b5da..1714c45 100644 --- a/src/main/java/BsK/client/network/handler/ClientHandler.java +++ b/src/main/java/BsK/client/network/handler/ClientHandler.java @@ -6,7 +6,9 @@ import BsK.client.ui.handler.UIHandler; import BsK.common.entity.DoctorItem; import BsK.common.packet.Packet; import BsK.common.packet.PacketSerializer; +import BsK.common.packet.req.PingRequest; import BsK.common.packet.res.*; +import BsK.common.util.network.NetworkUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.websocketx.*; @@ -35,6 +37,12 @@ public class ClientHandler extends SimpleChannelInboundHandler> responseListeners = listeners.get(packet.getClass()); @@ -156,33 +177,40 @@ public class ClientHandler extends SimpleChannelInboundHandler= MAX_MISSED_PONGS) { + log.error("Missed {} consecutive pongs - disconnecting", missedPongCount); + wasTimeoutDetected = true; + lastDisconnectionType = DisconnectionType.TIMEOUT; + ctx.close(); // Force disconnect + return; + } + } + + // Send new ping packet + log.debug("Sending PingRequest to server (missed count: {})", missedPongCount); + lastPingRequestTime = System.currentTimeMillis(); + awaitingPongResponse = true; + + PingRequest pingRequest = new PingRequest(); + NetworkUtil.sendPacket(ctx.channel(), pingRequest); + } else if (event.state() == IdleState.READER_IDLE) { - // Server hasn't responded in a while - this is a timeout scenario - log.warn("Server not responding - timeout detected"); + // Server hasn't sent any data (including pong) for 5 minutes + log.warn("Server not responding - no data received for 5 minutes (READER_IDLE)"); wasTimeoutDetected = true; lastDisconnectionType = DisconnectionType.TIMEOUT; - // Just set the flag, don't show dialog yet - let channelInactive handle it - // Try to send a ping to test connection - lastPingTime = System.currentTimeMillis(); - awaitingPong = true; - ctx.writeAndFlush(new PingWebSocketFrame()); - } - } else if (evt instanceof WebSocketFrame) { - // Handle pong responses - if (evt instanceof PongWebSocketFrame) { - lastPongTime = System.currentTimeMillis(); - long pingRoundTrip = lastPongTime - lastPingTime; - log.debug("Received pong from server (round trip: {}ms)", pingRoundTrip); - awaitingPong = false; - // Reset timeout flag since we got a response - wasTimeoutDetected = false; + // Let channelInactive handle the disconnect } } + + // IMPORTANT: Call super to ensure event propagation continues + super.userEventTriggered(ctx, evt); } @Override @@ -223,10 +251,10 @@ public class ClientHandler extends SimpleChannelInboundHandler= MAX_MISSED_PONGS) { lastDisconnectionType = DisconnectionType.TIMEOUT; - log.info("Channel inactive due to timeout"); - } else if (awaitingPong && (System.currentTimeMillis() - lastPingTime) > 60000) { + log.info("Channel inactive due to timeout (missed {} pongs)", missedPongCount); + } else if (awaitingPongResponse && (System.currentTimeMillis() - lastPingRequestTime) > 30000) { lastDisconnectionType = DisconnectionType.TIMEOUT; log.info("Channel inactive - server stopped responding to pings"); } else { @@ -262,6 +290,9 @@ public class ClientHandler extends SimpleChannelInboundHandler uploadPdfResponseListener = this::handleUploadPdfResponse; private final ResponseListener syncImagesResponseListener = this::handleSyncImagesResponse; private final ResponseListener getImageResponseListener = this::handleGetCheckupImageResponse; + private final ResponseListener deleteImageResponseListener = this::handleDeleteImageResponse; private JTextField checkupIdField, customerLastNameField, customerFirstNameField,customerAddressField, customerPhoneField, customerIdField, customerCccdDdcnField; private JTextArea suggestionField, diagnosisField, conclusionField; // Changed symptomsField to suggestionField private JTextPane notesField; @@ -365,6 +366,7 @@ public class CheckUpPage extends JPanel { ClientHandler.addResponseListener(UploadCheckupPdfResponse.class, uploadPdfResponseListener); ClientHandler.addResponseListener(SyncCheckupImagesResponse.class, syncImagesResponseListener); ClientHandler.addResponseListener(GetCheckupImageResponse.class, getImageResponseListener); + ClientHandler.addResponseListener(DeleteCheckupImageResponse.class, deleteImageResponseListener); // Instantiate the new queue page but don't show it yet queueManagementPage = new QueueManagementPage(); @@ -3652,6 +3654,45 @@ public class CheckUpPage extends JPanel { }); } + private void deleteImage(File imageFile) { + if (imageFile == null || !imageFile.exists()) { + log.warn("Cannot delete image - file does not exist or is null"); + return; + } + + String fileName = imageFile.getName(); + String checkupId = currentCheckupIdForMedia; + + if (checkupId == null || checkupId.trim().isEmpty()) { + log.error("Cannot delete image - no checkup ID available"); + JOptionPane.showMessageDialog(this, + "Không thể xóa ảnh - không có mã khám.", + "Lỗi", + JOptionPane.ERROR_MESSAGE); + return; + } + + // Send delete request to server + DeleteCheckupImageRequest request = new DeleteCheckupImageRequest(checkupId, fileName); + NetworkUtil.sendPacket(ClientHandler.ctx.channel(), request); + log.info("Sent DeleteCheckupImageRequest for file: {} in checkup: {}", fileName, checkupId); + + // Delete local file immediately + try { + if (imageFile.delete()) { + log.info("Successfully deleted local image file: {}", fileName); + // Refresh the gallery + if (currentCheckupMediaPath != null && Files.exists(currentCheckupMediaPath)) { + loadAndDisplayImages(currentCheckupMediaPath); + } + } else { + log.warn("Failed to delete local image file: {}", fileName); + } + } catch (Exception e) { + log.error("Error deleting local image file: {}", fileName, e); + } + } + private void handleUploadImageResponse(UploadCheckupImageResponse response) { String fileName = response.getFileName(); @@ -3672,6 +3713,29 @@ public class CheckUpPage extends JPanel { } } + private void handleDeleteImageResponse(DeleteCheckupImageResponse response) { + String fileName = response.getFileName(); + + if (response.isSuccess()) { + log.info("Successfully deleted image from server: {} - {}", fileName, response.getMessage()); + SwingUtilities.invokeLater(() -> { + // Image already deleted locally, just log success + if (callingStatusLabel != null) { + callingStatusLabel.setText("Đã xóa ảnh: " + fileName); + callingStatusLabel.setForeground(new Color(0, 150, 0)); // Green color + } + }); + } else { + log.error("Failed to delete image from server: {} - {}", fileName, response.getMessage()); + SwingUtilities.invokeLater(() -> { + JOptionPane.showMessageDialog(this, + "Lỗi khi xóa ảnh trên server: " + response.getMessage(), + "Lỗi Xóa Ảnh", + JOptionPane.ERROR_MESSAGE); + }); + } + } + private void handleUploadPdfResponse(UploadCheckupPdfResponse response) { if (response.isSuccess()) { log.info("Successfully uploaded PDF: {} - {}", response.getPdfType(), response.getMessage()); @@ -4091,11 +4155,33 @@ public class CheckUpPage extends JPanel { layeredPane.setBorder(BorderFactory.createLineBorder(Color.GRAY)); layeredPane.setCursor(new Cursor(Cursor.HAND_CURSOR)); // Set the hand cursor + // Create popup menu for right-click + JPopupMenu imagePopupMenu = new JPopupMenu(); + JMenuItem deleteMenuItem = new JMenuItem("Xoá"); + deleteMenuItem.setIcon(UIManager.getIcon("FileView.fileIcon")); // Optional icon + deleteMenuItem.addActionListener(ev -> { + int confirm = JOptionPane.showConfirmDialog( + CheckUpPage.this, + "Bạn có chắc chắn muốn xoá ảnh này không?\n" + imageFile.getName(), + "Xác nhận xoá", + JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); + + if (confirm == JOptionPane.YES_OPTION) { + deleteImage(imageFile); + } + }); + imagePopupMenu.add(deleteMenuItem); + // Add the click listener directly to the image label imageLabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { - showFullImageDialog(imageFile); + if (SwingUtilities.isRightMouseButton(e)) { + imagePopupMenu.show(e.getComponent(), e.getX(), e.getY()); + } else if (SwingUtilities.isLeftMouseButton(e)) { + showFullImageDialog(imageFile); + } } }); @@ -4300,6 +4386,20 @@ public class CheckUpPage extends JPanel { TableRowSorter sorter = new TableRowSorter<>(queueTableModel); queueTable.setRowSorter(sorter); + // Set custom comparator for STT column to sort as integers + sorter.setComparator(0, new Comparator() { + @Override + public int compare(String s1, String s2) { + try { + Integer i1 = Integer.parseInt(s1); + Integer i2 = Integer.parseInt(s2); + return i1.compareTo(i2); + } catch (NumberFormatException e) { + return s1.compareTo(s2); // Fallback to string comparison + } + } + }); + // Sort by "STT" (queue number) column in ascending order List sortKeys = new ArrayList<>(); sortKeys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING)); diff --git a/src/main/java/BsK/common/packet/req/DeleteCheckupImageRequest.java b/src/main/java/BsK/common/packet/req/DeleteCheckupImageRequest.java new file mode 100644 index 0000000..421408a --- /dev/null +++ b/src/main/java/BsK/common/packet/req/DeleteCheckupImageRequest.java @@ -0,0 +1,16 @@ +package BsK.common.packet.req; + +import BsK.common.packet.Packet; +import lombok.Data; + +@Data +public class DeleteCheckupImageRequest implements Packet { + private String checkupId; + private String fileName; + + public DeleteCheckupImageRequest(String checkupId, String fileName) { + this.checkupId = checkupId; + this.fileName = fileName; + } +} + diff --git a/src/main/java/BsK/common/packet/req/PingRequest.java b/src/main/java/BsK/common/packet/req/PingRequest.java index c2c0ae4..972adbb 100644 --- a/src/main/java/BsK/common/packet/req/PingRequest.java +++ b/src/main/java/BsK/common/packet/req/PingRequest.java @@ -1,9 +1,13 @@ package BsK.common.packet.req; import BsK.common.packet.Packet; -import lombok.AllArgsConstructor; import lombok.Data; -@AllArgsConstructor @Data -public class PingRequest implements Packet {} +public class PingRequest implements Packet { + private long timestamp; + + public PingRequest() { + this.timestamp = System.currentTimeMillis(); + } +} diff --git a/src/main/java/BsK/common/packet/res/DeleteCheckupImageResponse.java b/src/main/java/BsK/common/packet/res/DeleteCheckupImageResponse.java new file mode 100644 index 0000000..c615d95 --- /dev/null +++ b/src/main/java/BsK/common/packet/res/DeleteCheckupImageResponse.java @@ -0,0 +1,18 @@ +package BsK.common.packet.res; + +import BsK.common.packet.Packet; +import lombok.Data; + +@Data +public class DeleteCheckupImageResponse implements Packet { + private boolean success; + private String message; + private String fileName; + + public DeleteCheckupImageResponse(boolean success, String message, String fileName) { + this.success = success; + this.message = message; + this.fileName = fileName; + } +} + diff --git a/src/main/java/BsK/common/packet/res/PongResponse.java b/src/main/java/BsK/common/packet/res/PongResponse.java new file mode 100644 index 0000000..8a32576 --- /dev/null +++ b/src/main/java/BsK/common/packet/res/PongResponse.java @@ -0,0 +1,18 @@ +package BsK.common.packet.res; + +import BsK.common.packet.Packet; +import lombok.Data; + +@Data +public class PongResponse implements Packet { + private long timestamp; + + public PongResponse() { + this.timestamp = System.currentTimeMillis(); + } + + public PongResponse(long clientTimestamp) { + this.timestamp = clientTimestamp; + } +} + diff --git a/src/main/java/BsK/server/Server.java b/src/main/java/BsK/server/Server.java index 4ff0779..30578fb 100644 --- a/src/main/java/BsK/server/Server.java +++ b/src/main/java/BsK/server/Server.java @@ -294,9 +294,10 @@ public class Server { .addLast(new ChunkedWriteHandler()) .addLast(new HttpObjectAggregator(50 * 1024 * 1024)) .addLast(new WebSocketServerProtocolHandler("/", null, true, 50 * 1024 * 1024)) - // Add IdleStateHandler with longer timeout to be more tolerant of network issues - // Reader timeout: 90 seconds (longer than client's 60s to allow for network delays) - .addLast(new IdleStateHandler(90, 0, 0)) + // Add IdleStateHandler to detect inactive clients + // Reader timeout: 40 seconds - disconnect if no data from client (ping should arrive every 10s) + // Allow up to 4 missed pings (10s * 4 = 40s) before disconnecting + .addLast(new IdleStateHandler(40, 0, 0)) .addLast(new ServerHandler()); } }); diff --git a/src/main/java/BsK/server/network/handler/ServerHandler.java b/src/main/java/BsK/server/network/handler/ServerHandler.java index 1a8cf72..6ceeb5d 100644 --- a/src/main/java/BsK/server/network/handler/ServerHandler.java +++ b/src/main/java/BsK/server/network/handler/ServerHandler.java @@ -1217,6 +1217,59 @@ public class ServerHandler extends SimpleChannelInboundHandler { + try { + if (!Server.isGoogleDriveConnected()) { + log.info("Google Drive not connected - skipping image deletion for checkup {}", checkupId); + return; + } + + // Get the checkup's Google Drive folder ID from database + String checkupDriveFolderId = null; + String sql = "SELECT drive_folder_id FROM Checkup WHERE checkup_id = ?"; + + try (Connection conn = DatabaseManager.getConnection(); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setInt(1, Integer.parseInt(checkupId)); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + checkupDriveFolderId = rs.getString("drive_folder_id"); + } + } + } + + if (checkupDriveFolderId == null || checkupDriveFolderId.trim().isEmpty()) { + log.warn("Checkup {} has no Google Drive folder ID - cannot delete image", checkupId); + return; + } + + log.info("Deleting image {} from Google Drive for checkup {}", fileName, checkupId); + + // Find and delete the file from Google Drive + List files = + Server.getGoogleDriveService().findFilesByName(checkupDriveFolderId, fileName); + + if (files.isEmpty()) { + log.warn("File {} not found in Google Drive folder for checkup {}", fileName, checkupId); + return; + } + + // Delete all matching files (there should typically be only one) + for (com.google.api.services.drive.model.File file : files) { + Server.getGoogleDriveService().deleteFile(file.getId()); + log.info("Successfully deleted file {} (ID: {}) from Google Drive for checkup {}", + fileName, file.getId(), checkupId); + + if (ServerDashboard.getInstance() != null) { + ServerDashboard.getInstance().addLog( + String.format("Deleted image %s from Google Drive for checkup %s", fileName, checkupId) + ); + } + } + + } catch (NumberFormatException e) { + log.error("Invalid checkupId format '{}' for Google Drive deletion.", checkupId); + } catch (Exception e) { + log.error("Failed to delete image from Google Drive for checkup {}: {}", checkupId, e.getMessage(), e); + if (ServerDashboard.getInstance() != null) { + ServerDashboard.getInstance().addLog( + String.format("Failed to delete image %s from Google Drive for checkup %s: %s", + fileName, checkupId, e.getMessage()) + ); + } + } + }); + } + private void broadcastQueueUpdate() { // SỬA ĐỔI: Sử dụng một kết nối duy nhất, an toàn cho tất cả các truy vấn bên trong diff --git a/src/main/java/BsK/server/service/GoogleDriveServiceOAuth.java b/src/main/java/BsK/server/service/GoogleDriveServiceOAuth.java index 5788751..9816120 100644 --- a/src/main/java/BsK/server/service/GoogleDriveServiceOAuth.java +++ b/src/main/java/BsK/server/service/GoogleDriveServiceOAuth.java @@ -451,7 +451,7 @@ public class GoogleDriveServiceOAuth { * @return A list of File objects matching the name. * @throws IOException if the Google Drive API call fails. */ - private List findFilesByName(String parentFolderId, String fileName) throws IOException { + public List findFilesByName(String parentFolderId, String fileName) throws IOException { String query = String.format("name = '%s' and '%s' in parents and trashed = false", fileName.replace("'", "\\'"), // Escape single quotes in filename parentFolderId); @@ -523,4 +523,14 @@ public class GoogleDriveServiceOAuth { return fileId; } + + /** + * Deletes a file from Google Drive by its file ID. + * @param fileId The ID of the file to delete. + * @throws IOException if the deletion fails. + */ + public void deleteFile(String fileId) throws IOException { + driveService.files().delete(fileId).execute(); + log.info("Successfully deleted file with ID: {}", fileId); + } } \ No newline at end of file