33import io .github .cdimascio .dotenv .Dotenv ;
44import tools .jackson .databind .ObjectMapper ;
55
6+ import java .io .File ;
67import java .io .IOException ;
78import java .net .URI ;
89import java .net .http .HttpClient ;
910import java .net .http .HttpRequest ;
1011import java .net .http .HttpResponse ;
12+ import java .nio .file .Files ;
13+ import java .util .Base64 ;
1114import java .util .Objects ;
1215import java .util .function .Consumer ;
1316
1417public class NtfyConnectionImpl implements NtfyConnection {
1518
16- private final HttpClient http = HttpClient . newHttpClient () ;
19+ private final HttpClient http ;
1720 private final String hostName ;
18- private final ObjectMapper mapper = new ObjectMapper () ;
21+ private final ObjectMapper mapper ;
1922
2023 public NtfyConnectionImpl () {
21- Dotenv dotenv = Dotenv .load ();
22- hostName = Objects .requireNonNull (dotenv .get ("HOST_NAME" ));
24+ this (HttpClient .newHttpClient (), new ObjectMapper (), loadHostNameFromEnv ());
2325 }
2426
2527 public NtfyConnectionImpl (String hostName ) {
28+ this (HttpClient .newHttpClient (), new ObjectMapper (), hostName );
29+ }
30+
31+
32+ NtfyConnectionImpl (HttpClient http , ObjectMapper mapper , String hostName ) {
33+ this .http = http ;
34+ this .mapper = mapper ;
2635 this .hostName = hostName ;
2736 }
2837
38+ private static String loadHostNameFromEnv () {
39+ Dotenv dotenv = Dotenv .load ();
40+ return Objects .requireNonNull (dotenv .get ("HOST_NAME" ));
41+ }
42+
2943 @ Override
3044 public boolean send (String message ) {
31- HttpRequest httpRequest = HttpRequest .newBuilder ()
32- .POST (HttpRequest .BodyPublishers .ofString (message ))
33- .header ("Cache" , "no" )
34- .uri (URI .create (hostName + "/mytopic" ))
35- .build ();
45+ if (message == null || message .trim ().isEmpty ()) {
46+ return false ;
47+ }
48+
49+ try {
50+
51+ String jsonPayload = String .format ("{\" message\" :\" %s\" }" , escapeJson (message .trim ()));
52+
53+ HttpRequest httpRequest = HttpRequest .newBuilder ()
54+ .POST (HttpRequest .BodyPublishers .ofString (jsonPayload ))
55+ .header ("Content-Type" , "application/json" )
56+ .header ("Cache" , "no-cache" )
57+ .uri (URI .create (hostName + "/mytopic" ))
58+ .build ();
59+
60+
61+ http .sendAsync (httpRequest , HttpResponse .BodyHandlers .discarding ())
62+ .thenAccept (response -> {
63+ if (response .statusCode () == 200 ) {
64+ System .out .println ("Message sent successfully" );
65+ } else {
66+ System .out .println ("Failed to send message. Status: " + response .statusCode ());
67+ }
68+ })
69+ .exceptionally (ex -> {
70+ System .out .println ("Error sending message: " + ex .getMessage ());
71+ return null ;
72+ });
73+
74+ return true ;
75+ } catch (Exception e ) {
76+ System .out .println ("Error in send: " + e .getMessage ());
77+ return false ;
78+ }
79+ }
80+
81+ @ Override
82+ public boolean sendFile (File file ) {
83+ if (file == null || !file .exists ()) {
84+ return false ;
85+ }
86+
3687 try {
37- //Todo: handle long blocking send requests to not freeze the JavaFX thread
38- //1. Use thread send message?
39- //2. Use async?
40- var reponse = http .send (httpRequest , HttpResponse .BodyHandlers .discarding ());
88+ byte [] fileContent = Files .readAllBytes (file .toPath ());
89+ String base64Content = Base64 .getEncoder ().encodeToString (fileContent );
90+
91+
92+ String jsonPayload = String .format (
93+ "{\" message\" :\" File: %s\" , \" file\" :\" %s\" , \" filename\" :\" %s\" }" ,
94+ escapeJson (file .getName ()), base64Content , escapeJson (file .getName ())
95+ );
96+
97+ HttpRequest httpRequest = HttpRequest .newBuilder ()
98+ .POST (HttpRequest .BodyPublishers .ofString (jsonPayload ))
99+ .header ("Content-Type" , "application/json" )
100+ .header ("Cache" , "no-cache" )
101+ .uri (URI .create (hostName + "/mytopic" ))
102+ .build ();
103+
104+ http .sendAsync (httpRequest , HttpResponse .BodyHandlers .discarding ())
105+ .thenAccept (response -> {
106+ if (response .statusCode () == 200 ) {
107+ System .out .println ("File sent successfully: " + file .getName ());
108+ } else {
109+ System .out .println ("Failed to send file. Status: " + response .statusCode ());
110+ }
111+ })
112+ .exceptionally (ex -> {
113+ System .out .println ("Error sending file: " + ex .getMessage ());
114+ return null ;
115+ });
116+
41117 return true ;
42118 } catch (IOException e ) {
43- System .out .println ("Error sending message" );
44- } catch (InterruptedException e ) {
45- System .out .println ("Interruped sending message" );
119+ System .out .println ("Error reading file: " + e .getMessage ());
120+ return false ;
46121 }
47- return false ;
48122 }
49123
50124 @ Override
51125 public void receive (Consumer <NtfyMessageDto > messageHandler ) {
52- HttpRequest httpRequest = HttpRequest .newBuilder ()
53- .GET ()
54- .uri (URI .create (hostName + "/mytopic/json" ))
55- .build ();
56-
57- http .sendAsync (httpRequest , HttpResponse .BodyHandlers .ofLines ())
58- .thenAccept (response -> response .body ()
59- .map (s ->
60- mapper .readValue (s , NtfyMessageDto .class ))
61- .filter (message -> message .event ().equals ("message" ))
62- .peek (System .out ::println )
63- .forEach (messageHandler ));
126+ try {
127+ HttpRequest httpRequest = HttpRequest .newBuilder ()
128+ .GET ()
129+ .uri (URI .create (hostName + "/mytopic/json" ))
130+ .build ();
131+
132+ http .sendAsync (httpRequest , HttpResponse .BodyHandlers .ofLines ())
133+ .thenAccept (response -> {
134+ if (response .statusCode () == 200 ) {
135+ response .body ()
136+ .map (s -> {
137+ try {
138+ return mapper .readValue (s , NtfyMessageDto .class );
139+ } catch (Exception e ) {
140+ System .out .println ("Error parsing message: " + e .getMessage ());
141+ return null ;
142+ }
143+ })
144+ .filter (Objects ::nonNull )
145+ .filter (message -> "message" .equals (message .event ()))
146+ .forEach (messageHandler );
147+ } else {
148+ System .out .println ("Failed to receive messages. Status: " + response .statusCode ());
149+ }
150+ })
151+ .exceptionally (ex -> {
152+ System .out .println ("Error receiving messages: " + ex .getMessage ());
153+ return null ; // Lade till return statement här
154+ });
155+ } catch (Exception e ) {
156+ System .out .println ("Error in receive: " + e .getMessage ());
157+ }
158+ }
159+
160+ private String escapeJson (String text ) {
161+ if (text == null ) return "" ;
162+ return text .replace ("\\ " , "\\ \\ " )
163+ .replace ("\" " , "\\ \" " )
164+ .replace ("\n " , "\\ n" )
165+ .replace ("\r " , "\\ r" )
166+ .replace ("\t " , "\\ t" );
64167 }
65168}
0 commit comments