diff --git a/pom.xml b/pom.xml
index fdb520a9..c40f667e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,23 +45,9 @@
javafx-fxml
${javafx.version}
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.11.0
-
- 25
- 25
- 25
-
-
-
org.openjfx
javafx-maven-plugin
@@ -69,7 +55,7 @@
com.example.HelloFX
-
+
javafx
true
@@ -77,22 +63,6 @@
true
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 3.1.2
-
- false
-
- **/*Test.java
-
-
-
-
-
-
-
diff --git a/src/main/java/com/example/ChatController.java b/src/main/java/com/example/ChatController.java
deleted file mode 100644
index 2cc49f68..00000000
--- a/src/main/java/com/example/ChatController.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.example;
-
-import javafx.fxml.FXML;
-import javafx.scene.control.ListView;
-import javafx.scene.control.TextField;
-import javafx.application.Platform;
-
-public class ChatController {
-
- @FXML
- private ListView messagesList;
-
- @FXML
- private TextField inputField;
-
- private final ChatModel model = new ChatModel();
-
-
- @FXML
- private void onSend() {
- String message = inputField.getText().trim();
- if (!message.isEmpty()) {
- messagesList.getItems().add("Me: " + message);
- model.sendMessage(message);
- inputField.clear();
- }
- }
-
-
- @FXML
- private void initialize(){
- model.subscribe(msg -> {
- Platform.runLater(() -> messagesList.getItems().add("Friend: " + msg));
- });
- }
-
-
-
-
-
-
-}
diff --git a/src/main/java/com/example/ChatModel.java b/src/main/java/com/example/ChatModel.java
deleted file mode 100644
index dc5973f9..00000000
--- a/src/main/java/com/example/ChatModel.java
+++ /dev/null
@@ -1,120 +0,0 @@
-package com.example;
-
-import javafx.application.Platform;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-import java.net.URI;
-import java.net.http.HttpClient;
-import java.net.http.HttpRequest;
-import java.net.http.HttpResponse;
-import java.util.Collections;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.Consumer;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class ChatModel {
-
- private final String sendUrl;
- private final String subscribeUrl;
- private final String clientId;
- private final Set sentMessages = Collections.newSetFromMap(new ConcurrentHashMap<>());
- private final HttpClient httpClient;
- private final Consumer platformRunner;
-
- public ChatModel() {
- this(HttpClient.newHttpClient(), Platform::runLater);
- }
-
- public ChatModel(HttpClient httpClient, Consumer platformRunner) {
- String topic = System.getenv().getOrDefault("NTFY_TOPIC", "https://ntfy.sh/newchatroom3");
- this.sendUrl = topic;
- this.subscribeUrl = topic + "/sse";
- this.clientId = UUID.randomUUID().toString();
- this.httpClient = httpClient;
- this.platformRunner = platformRunner;
- }
-
- public void sendMessage(String message) {
- sentMessages.add(message);
-
- new Thread(() -> {
- try {
- Thread.sleep(5000);
- } catch (InterruptedException ignored) {
- }
- sentMessages.remove(message);
- }, "SentMessageCleaner").start();
-
- HttpRequest request = HttpRequest.newBuilder()
- .uri(URI.create(sendUrl))
- .header("Content-Type", "application/json")
- .header("X-Client-ID", clientId)
- .header("Title", "Friend: ")
- .POST(HttpRequest.BodyPublishers.ofString(message))
- .build();
-
- httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
- .thenAccept(response -> System.out.println("Sent, status=" + response.statusCode()))
- .exceptionally(e -> {
- e.printStackTrace();
- return null;
- });
- }
-
-
- public void subscribe(Consumer onMessageReceived) {
- HttpRequest request = HttpRequest.newBuilder()
- .uri(URI.create(subscribeUrl))
- .header("Accept", "text/event-stream")
- .build();
-
- httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream())
- .thenAccept(response -> {
- try (BufferedReader reader = new BufferedReader(new InputStreamReader(response.body()))) {
- String line;
-// boolean firstMessageSkipped = false;
- while ((line = reader.readLine()) != null) {
- if (line.startsWith("data:")) {
-// if (!firstMessageSkipped) {
-// firstMessageSkipped = true;
-// continue;
-// }
-
- String raw = line.substring(5).trim();
- String msg = parseMessage(raw);
-
- if (msg != null && !sentMessages.contains(msg)) {
- platformRunner.accept(() -> onMessageReceived.accept(msg));
- }
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- })
- .exceptionally(e -> { e.printStackTrace(); return null; });
- }
-
- public String parseMessage(String data) {
- try {
- Matcher eventMatcher = Pattern.compile("\"event\"\\s*:\\s*\"(.*?)\"").matcher(data);
- if (eventMatcher.find()) {
- String event = eventMatcher.group(1);
- if (!"message".equals(event)) {
- return null;
- }
- }
-
- Matcher msgMatcher = Pattern.compile("\"message\"\\s*:\\s*\"(.*?)\"").matcher(data);
- if (msgMatcher.find()) {
- return msgMatcher.group(1).replace("\\\"", "\"");
- }
- } catch (Exception ignored) {}
- return null;
- }
-
-}
diff --git a/src/main/java/com/example/HelloFX.java b/src/main/java/com/example/HelloFX.java
index be82aace..96bdc5ca 100644
--- a/src/main/java/com/example/HelloFX.java
+++ b/src/main/java/com/example/HelloFX.java
@@ -10,10 +10,10 @@ public class HelloFX extends Application {
@Override
public void start(Stage stage) throws Exception {
- FXMLLoader fxmlLoader = new FXMLLoader(HelloFX.class.getResource("chat-view.fxml"));
+ FXMLLoader fxmlLoader = new FXMLLoader(HelloFX.class.getResource("hello-view.fxml"));
Parent root = fxmlLoader.load();
Scene scene = new Scene(root, 640, 480);
- stage.setTitle("Chat App");
+ stage.setTitle("Hello MVC");
stage.setScene(scene);
stage.show();
}
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 0a19298c..71574a27 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -1,8 +1,6 @@
module hellofx {
requires javafx.controls;
requires javafx.fxml;
- requires java.net.http;
-
opens com.example to javafx.fxml;
exports com.example;
diff --git a/src/main/resources/com/example/chat-view.fxml b/src/main/resources/com/example/chat-view.fxml
deleted file mode 100644
index 667d541b..00000000
--- a/src/main/resources/com/example/chat-view.fxml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/test/java/com/example/ChatModelTest.java b/src/test/java/com/example/ChatModelTest.java
deleted file mode 100644
index 71c267aa..00000000
--- a/src/test/java/com/example/ChatModelTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.example;
-
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import java.net.http.HttpClient;
-import java.net.http.HttpRequest;
-import java.net.http.HttpResponse;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.atomic.AtomicReference;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.*;
-
-class ChatModelTest {
-
- private HttpClient mockHttpClient;
- private ChatModel chatModel;
-
- @BeforeEach
- void setUp() {
- mockHttpClient = mock(HttpClient.class);
- chatModel = new ChatModel(mockHttpClient, Runnable::run);
- }
-
- @Test
- void testParseMessageReturnsMessage() {
- String data = "{\"event\":\"message\",\"message\":\"Hello World\"}";
- String result = chatModel.parseMessage(data);
- assertEquals("Hello World", result);
- }
-
- @Test
- void testParseMessageIgnoresNonMessageEvent() {
- String data = "{\"event\":\"update\",\"message\":\"Hello World\"}";
- String result = chatModel.parseMessage(data);
- assertNull(result);
- }
-
- @Test
- void testSendMessageCallsHttpClient() throws Exception {
- HttpResponse mockResponse = mock(HttpResponse.class);
- when(mockResponse.statusCode()).thenReturn(200);
-
- CompletableFuture> future = CompletableFuture.completedFuture(mockResponse);
- when(mockHttpClient.sendAsync(any(HttpRequest.class), any(HttpResponse.BodyHandler.class)))
- .thenReturn(future);
-
- chatModel.sendMessage("Hi there");
-
- Thread.sleep(100);
-
- verify(mockHttpClient, times(1))
- .sendAsync(any(HttpRequest.class), any(HttpResponse.BodyHandler.class));
- }
-
- @Test
- void testSubscribeCallsConsumer() throws Exception {
- String sseData = "data:{\"event\":\"message\",\"message\":\"Hello\"}\n";
- HttpResponse mockResponse = mock(HttpResponse.class);
- when(mockResponse.body()).thenReturn(new java.io.ByteArrayInputStream(sseData.getBytes()));
-
- CompletableFuture> future = CompletableFuture.completedFuture(mockResponse);
- when(mockHttpClient.sendAsync(any(HttpRequest.class), any(HttpResponse.BodyHandler.class)))
- .thenReturn(future);
-
- AtomicReference received = new AtomicReference<>();
- chatModel.subscribe(received::set);
-
- Thread.sleep(100);
-
- assertEquals("Hello", received.get());
- }
-}