22
33import com .google .gson .JsonObject ;
44import com .sun .javafx .collections .ObservableListWrapper ;
5- import javafx .scene .control .Button ;
6- import javafx .scene .control .ListView ;
7- import javafx .scene .control .TextArea ;
8- import javafx .scene .control .TextField ;
5+ import javafx .beans .property .SimpleStringProperty ;
6+ import javafx .scene .control .*;
7+ import javafx .scene .control .cell .TextFieldTableCell ;
98import javafx .scene .input .MouseEvent ;
9+ import javafx .scene .layout .GridPane ;
10+ import javafx .scene .layout .Priority ;
1011import org .jetbrains .annotations .NotNull ;
1112
12- import java .util .ArrayList ;
13+ import java .io .PrintWriter ;
14+ import java .io .StringWriter ;
15+ import java .net .URI ;
16+ import java .net .URISyntaxException ;
17+ import java .util .*;
1318import java .util .concurrent .ThreadLocalRandom ;
1419
1520/**
@@ -23,17 +28,91 @@ public class MainController implements NetworkThread.Listener, NetworkThread.Cal
2328 public TextField jsonrpcMethod ;
2429 public TextArea jsonrpcParams ;
2530 public ListView <String > responses ;
31+ public TextField mercuryContentType ;
32+ public TextField mercuryUri ;
33+ public ComboBox <String > mercuryMethod ;
34+ public TitledPane receivedContainer ;
35+ public TitledPane sendContainer ;
36+ public TableView <Header > mercuryHeaders ;
37+ public TableColumn <Header , String > mercuryHeaderKeys ;
38+ public TableColumn <Header , String > mercuryHeaderValues ;
2639 private NetworkThread networkThread ;
2740
2841 public MainController () {
2942 }
3043
3144 public void initialize () {
3245 responses .setItems (new ObservableListWrapper <>(new ArrayList <>()));
46+ mercuryMethod .setItems (new ObservableListWrapper <>(Arrays .asList ("GET" , "SUB" , "UNSUB" , "SEND" )));
47+ sendContainer .setDisable (true );
48+ receivedContainer .setDisable (true );
49+
50+ mercuryHeaderKeys .setCellValueFactory (param -> param .getValue ().key );
51+ mercuryHeaderKeys .setCellFactory (TextFieldTableCell .forTableColumn ());
52+ mercuryHeaderKeys .setOnEditCommit (t -> {
53+ Header header = t .getTableView ().getItems ().get (t .getTablePosition ().getRow ());
54+ header .key .set (t .getNewValue ());
55+
56+ if (header .key .isEmpty ().get () && header .value .isEmpty ().get ())
57+ t .getTableView ().getItems ().remove (header );
58+ });
59+
60+ mercuryHeaderValues .setCellValueFactory (param -> param .getValue ().value );
61+ mercuryHeaderValues .setCellFactory (TextFieldTableCell .forTableColumn ());
62+ mercuryHeaderValues .setOnEditCommit (t -> {
63+ Header header = t .getTableView ().getItems ().get (t .getTablePosition ().getRow ());
64+ header .value .set (t .getNewValue ());
65+
66+ if (header .key .isEmpty ().get () && header .value .isEmpty ().get ())
67+ t .getTableView ().getItems ().remove (header );
68+ });
69+
70+ mercuryHeaders .setItems (new ObservableListWrapper <>(new ArrayList <>()));
3371 }
3472
3573 public void clickedConnect (MouseEvent mouseEvent ) {
36- networkThread = new NetworkThread (address .getText (), this );
74+ try {
75+ networkThread = new NetworkThread (new URI (address .getText ()), this );
76+ } catch (URISyntaxException ex ) {
77+ showError (ex );
78+ }
79+ }
80+
81+ private void showError (String msg ) {
82+ Alert alert = new Alert (Alert .AlertType .ERROR );
83+ alert .setTitle ("An error occurred!" );
84+ alert .setHeaderText ("Look, an Error Dialog" );
85+ alert .setContentText ("Ooops, there was an error!" );
86+
87+ alert .showAndWait ();
88+ }
89+
90+ private void showError (@ NotNull Throwable throwable ) {
91+ Alert alert = new Alert (Alert .AlertType .ERROR );
92+ alert .setTitle ("An error occurred!" );
93+ alert .setHeaderText (throwable .getMessage ());
94+
95+ StringWriter sw = new StringWriter ();
96+ throwable .printStackTrace (new PrintWriter (sw ));
97+ String exceptionText = sw .toString ();
98+
99+ Label label = new Label ("The exception stacktrace was:" );
100+ TextArea textArea = new TextArea (exceptionText );
101+ textArea .setEditable (false );
102+ textArea .setWrapText (true );
103+
104+ textArea .setMaxWidth (Double .MAX_VALUE );
105+ textArea .setMaxHeight (Double .MAX_VALUE );
106+ GridPane .setVgrow (textArea , Priority .ALWAYS );
107+ GridPane .setHgrow (textArea , Priority .ALWAYS );
108+
109+ GridPane expContent = new GridPane ();
110+ expContent .setMaxWidth (Double .MAX_VALUE );
111+ expContent .add (label , 0 , 0 );
112+ expContent .add (textArea , 0 , 1 );
113+
114+ alert .getDialogPane ().setExpandableContent (expContent );
115+ alert .showAndWait ();
37116 }
38117
39118 public void clickedDisconnect (MouseEvent mouseEvent ) {
@@ -48,13 +127,23 @@ public void connected() {
48127 connect .setVisible (false );
49128 disconnect .setVisible (true );
50129 address .setDisable (true );
130+ sendContainer .setDisable (false );
131+ receivedContainer .setDisable (false );
132+ }
133+
134+ @ Override
135+ public void error (@ NotNull Throwable ex ) {
136+ showError (ex );
137+ closed ();
51138 }
52139
53140 @ Override
54141 public void closed () {
55142 connect .setVisible (true );
56143 disconnect .setVisible (false );
57144 address .setDisable (false );
145+ sendContainer .setDisable (true );
146+ receivedContainer .setDisable (true );
58147 }
59148
60149 @ Override
@@ -66,14 +155,46 @@ public void clickedGenerateId(MouseEvent mouseEvent) {
66155 jsonrpcId .setText (String .valueOf (ThreadLocalRandom .current ().nextInt (1000 )));
67156 }
68157
69- public void clickedSend (MouseEvent mouseEvent ) {
158+ public void clickedGeneralSend (MouseEvent mouseEvent ) {
159+ if (networkThread == null ) return ;
160+
161+ networkThread .sendGeneral (jsonrpcId .getText (), jsonrpcMethod .getText (), jsonrpcParams .getText (), this );
162+ }
163+
164+ public void clickedMercurySend (MouseEvent mouseEvent ) {
70165 if (networkThread == null ) return ;
71166
72- networkThread .send (jsonrpcId .getText (), jsonrpcMethod .getText (), jsonrpcParams .getText (), this );
167+ networkThread .sendMercury (mercuryMethod .getSelectionModel ().getSelectedItem (), mercuryUri .getText (),
168+ mercuryContentType .getText (), Header .toMap (mercuryHeaders .getItems ()), this );
73169 }
74170
75171 @ Override
76172 public void response (@ NotNull JsonObject json ) {
77173 responses .getItems ().add (json .toString ());
78174 }
175+
176+ public void clickedMercuryAddEmptyHeader (MouseEvent mouseEvent ) {
177+ mercuryHeaders .getItems ().add (new Header ("" , "" ));
178+ int last = mercuryHeaders .getItems ().size () - 1 ;
179+ mercuryHeaders .getSelectionModel ().select (last );
180+ mercuryHeaders .getFocusModel ().focus (last );
181+ }
182+
183+ public static class Header {
184+ private final SimpleStringProperty key ;
185+ private final SimpleStringProperty value ;
186+
187+ Header (String key , String value ) {
188+ this .key = new SimpleStringProperty (null , "key" , key );
189+ this .value = new SimpleStringProperty (null , "value" , value );
190+ }
191+
192+ @ NotNull
193+ static Map <String , String > toMap (List <Header > list ) {
194+ Map <String , String > map = new HashMap <>();
195+ for (Header header : list ) map .put (header .key .getValue (), header .value .getValue ());
196+ return map ;
197+ }
198+ }
199+
79200}
0 commit comments