diff --git a/config/settings.json b/config/settings.json deleted file mode 100644 index c097267..0000000 --- a/config/settings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "responseAreaFont": "Liberation Mono", - "responseAreaFontSize": "18", - "connectionTimeOutEnable": "false", - "connectionTimeOut": "10000", - "connectionReadTimeOutEnable": "false", - "connectionReadTimeOut": "30000", - "theme": null -} \ No newline at end of file diff --git a/src/main/java/com/rohitawate/restaurant/homewindow/BodyTabController.java b/src/main/java/com/rohitawate/restaurant/homewindow/BodyTabController.java index 191b358..70002a3 100644 --- a/src/main/java/com/rohitawate/restaurant/homewindow/BodyTabController.java +++ b/src/main/java/com/rohitawate/restaurant/homewindow/BodyTabController.java @@ -16,22 +16,21 @@ package com.rohitawate.restaurant.homewindow; +import com.rohitawate.restaurant.models.DashboardState; import com.rohitawate.restaurant.models.requests.DataDispatchRequest; import com.rohitawate.restaurant.util.themes.ThemeManager; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.scene.Parent; -import javafx.scene.control.ComboBox; -import javafx.scene.control.Tab; -import javafx.scene.control.TextArea; -import javafx.scene.control.TextField; +import javafx.scene.control.*; import javafx.stage.FileChooser; import javafx.stage.Window; import javax.ws.rs.core.MediaType; import java.io.IOException; import java.net.URL; +import java.util.Map; import java.util.ResourceBundle; /* @@ -40,6 +39,8 @@ import java.util.ResourceBundle; URL encoded and Form tabs have special FXMLs. */ public class BodyTabController implements Initializable { + @FXML + private TabPane bodyTabPane; @FXML private ComboBox rawInputTypeBox; @FXML @@ -101,7 +102,6 @@ public class BodyTabController implements Initializable { } else if (formTab.isSelected()) { request.setStringTuples(formDataTabController.getStringTuples()); request.setFileTuples(formDataTabController.getFileTuples()); - request.setContentType(MediaType.MULTIPART_FORM_DATA); } else if (binaryTab.isSelected()) { request.setBody(filePathField.getText()); @@ -126,4 +126,48 @@ public class BodyTabController implements Initializable { } filePathField.setText(filePath); } + + public void setState(DashboardState dashboardState) { + switch (dashboardState.getContentType()) { + case MediaType.TEXT_PLAIN: + rawInputArea.setText(dashboardState.getBody()); + rawInputTypeBox.getSelectionModel().select("PLAIN TEXT"); + bodyTabPane.getSelectionModel().select(rawTab); + break; + case MediaType.APPLICATION_JSON: + rawInputArea.setText(dashboardState.getBody()); + rawInputTypeBox.getSelectionModel().select("JSON"); + bodyTabPane.getSelectionModel().select(rawTab); + break; + case MediaType.APPLICATION_XML: + rawInputArea.setText(dashboardState.getBody()); + rawInputTypeBox.getSelectionModel().select("XML"); + bodyTabPane.getSelectionModel().select(rawTab); + break; + case MediaType.TEXT_HTML: + rawInputArea.setText(dashboardState.getBody()); + rawInputTypeBox.getSelectionModel().select("HTML"); + bodyTabPane.getSelectionModel().select(rawTab); + break; + case MediaType.MULTIPART_FORM_DATA: + // For file tuples + for (Map.Entry entry : dashboardState.getFileTuples().entrySet()) + formDataTabController.addFileField(entry.getKey().toString(), entry.getValue().toString()); + + // For string tuples + for (Map.Entry entry : dashboardState.getStringTuples().entrySet()) + formDataTabController.addStringField(entry.getKey().toString(), entry.getValue().toString()); + bodyTabPane.getSelectionModel().select(formTab); + break; + case MediaType.APPLICATION_OCTET_STREAM: + filePathField.setText(dashboardState.getBody()); + bodyTabPane.getSelectionModel().select(binaryTab); + break; + case MediaType.APPLICATION_FORM_URLENCODED: + for (Map.Entry entry : dashboardState.getStringTuples().entrySet()) + urlTabController.addField(entry.getKey().toString(), entry.getValue().toString()); + bodyTabPane.getSelectionModel().select(urlTab); + break; + } + } } diff --git a/src/main/java/com/rohitawate/restaurant/homewindow/DashboardController.java b/src/main/java/com/rohitawate/restaurant/homewindow/DashboardController.java index 19616fb..ad11a90 100644 --- a/src/main/java/com/rohitawate/restaurant/homewindow/DashboardController.java +++ b/src/main/java/com/rohitawate/restaurant/homewindow/DashboardController.java @@ -18,10 +18,10 @@ package com.rohitawate.restaurant.homewindow; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXSnackbar; import com.rohitawate.restaurant.exceptions.UnreliableResponseException; +import com.rohitawate.restaurant.models.DashboardState; import com.rohitawate.restaurant.models.requests.DELETERequest; import com.rohitawate.restaurant.models.requests.DataDispatchRequest; import com.rohitawate.restaurant.models.requests.GETRequest; -import com.rohitawate.restaurant.models.requests.RestaurantRequest; import com.rohitawate.restaurant.models.responses.RestaurantResponse; import com.rohitawate.restaurant.requestsmanager.DELETERequestManager; import com.rohitawate.restaurant.requestsmanager.DataDispatchRequestManager; @@ -46,10 +46,7 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.ResourceBundle; +import java.util.*; public class DashboardController implements Initializable { @FXML @@ -103,13 +100,13 @@ public class DashboardController implements Initializable { IOE.printStackTrace(); } + // Select GET by default + httpMethodBox.getSelectionModel().select("GET"); + responseBox.getChildren().remove(0); promptLayer.setVisible(true); httpMethodBox.getItems().addAll(httpMethods); - // Selects GET by default - httpMethodBox.getSelectionModel().select(0); - paramsControllers = new ArrayList<>(); appendedParams = new ArrayList<>(); addParamField(); // Adds a blank param field @@ -200,7 +197,7 @@ public class DashboardController implements Initializable { } DataDispatchRequest dataDispatchRequest = - (DataDispatchRequest) bodyTabController.getBasicRequest(httpMethodBox.getValue()); + bodyTabController.getBasicRequest(httpMethodBox.getValue()); dataDispatchRequest.setTarget(addressField.getText()); dataDispatchRequest.setHeaders(headerTabController.getHeaders()); @@ -343,12 +340,43 @@ public class DashboardController implements Initializable { } } + private HashMap getParams() { + HashMap params = new HashMap<>(); + + for (StringKeyValueFieldController controller : paramsControllers) + params.put(controller.getHeader().getKey(), controller.getHeader().getValue()); + + return params; + } + @FXML private void addParamField() { + addParamField("", ""); + } + + // Adds a new URL-parameter field + private void addParamField(String key, String value) { + /* + Re-uses previous field if it is empty, + else loads a new one. + */ + if (paramsControllers.size() > 0) { + StringKeyValueFieldController previousController = paramsControllers.get(paramsControllers.size() - 1); + + if (previousController.isKeyFieldEmtpy() && + previousController.isValueFieldEmpty()) { + previousController.setKeyField(key); + previousController.setValueField(value); + return; + } + } + try { FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/homewindow/StringKeyValueField.fxml")); Parent headerField = loader.load(); StringKeyValueFieldController controller = loader.getController(); + controller.setKeyField(key); + controller.setValueField(value); paramsControllers.add(controller); paramsBox.getChildren().add(headerField); } catch (IOException e) { @@ -360,34 +388,55 @@ public class DashboardController implements Initializable { return addressField.textProperty(); } - // Returns the current state of the Dashboard - public RestaurantRequest getState() { + /** + * Returns the current state of the Dashboard + * + * @return DashboardState - Current state of the Dashboard + */ + public DashboardState getState() { + DashboardState dashboardState = null; try { switch (httpMethodBox.getValue()) { - case "GET": - GETRequest getRequest = new GETRequest(addressField.getText()); - getRequest.setHeaders(headerTabController.getHeaders()); - return getRequest; case "POST": case "PUT": - DataDispatchRequest dataDispatchRequest = bodyTabController.getBasicRequest(httpMethodBox.getValue()); - dataDispatchRequest.setHeaders(headerTabController.getHeaders()); - return dataDispatchRequest; - case "DELETE": - DELETERequest deleteRequest = new DELETERequest(addressField.getText()); - deleteRequest.setHeaders(headerTabController.getHeaders()); - return deleteRequest; + dashboardState = new DashboardState(bodyTabController.getBasicRequest(httpMethodBox.getValue())); + dashboardState.setHeaders(headerTabController.getHeaders()); + break; + default: + // For GET, DELETE requests + dashboardState = new DashboardState(); } + + dashboardState.setTarget(addressField.getText()); + dashboardState.setHttpMethod(httpMethodBox.getValue()); + dashboardState.setHeaders(headerTabController.getHeaders()); + dashboardState.setParams(getParams()); } catch (MalformedURLException MURLE) { System.out.println("Dashboard state was saved with a malformed URL."); } - return null; + return dashboardState; } - public void setState(RestaurantRequest request) { - addressField.setText(request.getTarget().toString()); + /** + * Sets the Dashboard to the given application state. + * + * @param dashboardState - State of the dashboard + */ + public void setState(DashboardState dashboardState) { + if (dashboardState.getTarget() != null) + addressField.setText(dashboardState.getTarget().toString()); - for (Map.Entry entry : request.getHeaders().entrySet()) - headerTabController.addHeader(entry.getKey().toString(), entry.getValue().toString()); + httpMethodBox.getSelectionModel().select(dashboardState.getHttpMethod()); + + if (dashboardState.getHeaders() != null) + for (Map.Entry entry : dashboardState.getHeaders().entrySet()) + headerTabController.addHeader(entry.getKey().toString(), entry.getValue().toString()); + + if (dashboardState.getParams() != null) + for (Map.Entry entry : dashboardState.getParams().entrySet()) + addParamField(entry.getKey().toString(), entry.getValue().toString()); + + if (httpMethodBox.getValue().equals("POST") || httpMethodBox.getValue().equals("PUT")) + bodyTabController.setState(dashboardState); } } diff --git a/src/main/java/com/rohitawate/restaurant/homewindow/FileKeyValueFieldController.java b/src/main/java/com/rohitawate/restaurant/homewindow/FileKeyValueFieldController.java index b77eaa0..69009da 100644 --- a/src/main/java/com/rohitawate/restaurant/homewindow/FileKeyValueFieldController.java +++ b/src/main/java/com/rohitawate/restaurant/homewindow/FileKeyValueFieldController.java @@ -89,4 +89,12 @@ public class FileKeyValueFieldController implements Initializable { public boolean isChecked() { return checkBox.isSelected(); } + + public void setFileKeyField(String key) { + fileKeyField.setText(key); + } + + public void setFileValueField(String value) { + fileValueField.setText(value); + } } diff --git a/src/main/java/com/rohitawate/restaurant/homewindow/FormDataTabController.java b/src/main/java/com/rohitawate/restaurant/homewindow/FormDataTabController.java index 31eaf2a..8f437b2 100644 --- a/src/main/java/com/rohitawate/restaurant/homewindow/FormDataTabController.java +++ b/src/main/java/com/rohitawate/restaurant/homewindow/FormDataTabController.java @@ -48,11 +48,17 @@ public class FormDataTabController implements Initializable { @FXML private void addFileField() { + addFileField("", ""); + } + + public void addFileField(String key, String value) { try { FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/homewindow/FileKeyValueField.fxml")); Parent headerField = loader.load(); ThemeManager.setTheme(headerField); FileKeyValueFieldController controller = loader.getController(); + controller.setFileKeyField(key); + controller.setFileValueField(value); fileControllers.add(controller); headersBox.getChildren().add(headerField); } catch (IOException e) { @@ -62,10 +68,16 @@ public class FormDataTabController implements Initializable { @FXML private void addStringField() { + addStringField("", ""); + } + + public void addStringField(String key, String value) { try { FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/homewindow/StringKeyValueField.fxml")); Parent headerField = loader.load(); StringKeyValueFieldController controller = loader.getController(); + controller.setKeyField(key); + controller.setValueField(value); stringControllers.add(controller); headersBox.getChildren().add(headerField); } catch (IOException e) { diff --git a/src/main/java/com/rohitawate/restaurant/homewindow/HomeWindowController.java b/src/main/java/com/rohitawate/restaurant/homewindow/HomeWindowController.java index 6b884c0..7a1c51e 100644 --- a/src/main/java/com/rohitawate/restaurant/homewindow/HomeWindowController.java +++ b/src/main/java/com/rohitawate/restaurant/homewindow/HomeWindowController.java @@ -16,7 +16,7 @@ package com.rohitawate.restaurant.homewindow; -import com.rohitawate.restaurant.models.requests.RestaurantRequest; +import com.rohitawate.restaurant.models.DashboardState; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.fxml.FXML; @@ -63,14 +63,14 @@ public class HomeWindowController implements Initializable { addTab(null); } - private void addTab(RestaurantRequest request) { + private void addTab(DashboardState dashboardState) { try { Tab newTab = new Tab(); FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/homewindow/Dashboard.fxml")); Parent dashboard = loader.load(); DashboardController controller = loader.getController(); - if (request != null) - controller.setState(request); + if (dashboardState != null) + controller.setState(dashboardState); newTab.setContent(dashboard); newTab.textProperty().bind(Bindings .when(controller.getAddressProperty().isNotEmpty()) @@ -89,11 +89,11 @@ public class HomeWindowController implements Initializable { } private void saveState() { - List states = new ArrayList<>(); + List dashboardStates = new ArrayList<>(); // Get the states of all the tabs for (DashboardController controller : controllers) - states.add(controller.getState()); + dashboardStates.add(controller.getState()); try { File configFolder = new File("config/"); @@ -102,8 +102,9 @@ public class HomeWindowController implements Initializable { OutputStream fileStream = new FileOutputStream("config/restaurant.state"); ObjectOutputStream objectStream = new ObjectOutputStream(fileStream); - objectStream.writeObject(states); + objectStream.writeObject(dashboardStates); objectStream.close(); + fileStream.close(); System.out.println("Application state saved successfully."); } catch (IOException e) { System.out.println("Failed to save the application's state:"); @@ -116,24 +117,26 @@ public class HomeWindowController implements Initializable { InputStream fileStream = new FileInputStream("config/restaurant.state"); ObjectInputStream objectStream = new ObjectInputStream(fileStream); - System.out.print("Application state file found. Recovering state... "); + System.out.println("Application state file found. Recovering state... "); - List states = (List) objectStream.readObject(); + List dashboardStates = (List) objectStream.readObject(); + objectStream.close(); + fileStream.close(); - if (states.size() > 0) { - for (RestaurantRequest request : states) - addTab(request); + if (dashboardStates.size() > 0) { + for (DashboardState dashboardState : dashboardStates) + addTab(dashboardState); } else { addTab(); } } catch (FileNotFoundException e) { - System.out.print("Application state file not found. Loading default state... "); + System.out.println("Application state file not found. Loading default state... "); addTab(); } catch (IOException | ClassNotFoundException e) { - System.out.print("Application state file is possibly corrupted. Could not recover the state.\nLoading default state... "); + System.out.println("Application state file is possibly corrupted. Could not recover the state.\nLoading default state... "); addTab(); } finally { - System.out.println("Successful"); + System.out.println("Application loaded."); } } } diff --git a/src/main/java/com/rohitawate/restaurant/homewindow/URLTabController.java b/src/main/java/com/rohitawate/restaurant/homewindow/URLTabController.java index e6149c8..b9255fb 100644 --- a/src/main/java/com/rohitawate/restaurant/homewindow/URLTabController.java +++ b/src/main/java/com/rohitawate/restaurant/homewindow/URLTabController.java @@ -44,11 +44,17 @@ public class URLTabController implements Initializable { @FXML private void addField() { + addField("", ""); + } + + public void addField(String key, String value) { try { FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/homewindow/StringKeyValueField.fxml")); Parent parent = loader.load(); ThemeManager.setTheme(parent); StringKeyValueFieldController controller = loader.getController(); + controller.setKeyField(key); + controller.setValueField(value); controllers.add(controller); fieldsBox.getChildren().add(parent); } catch (IOException e) { diff --git a/src/main/java/com/rohitawate/restaurant/models/DashboardState.java b/src/main/java/com/rohitawate/restaurant/models/DashboardState.java new file mode 100644 index 0000000..7556a25 --- /dev/null +++ b/src/main/java/com/rohitawate/restaurant/models/DashboardState.java @@ -0,0 +1,62 @@ +/* + * Copyright 2018 Rohit Awate. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.rohitawate.restaurant.models; + +import com.rohitawate.restaurant.models.requests.DataDispatchRequest; + +import java.io.Serializable; +import java.util.HashMap; + +/** + * Convenience class to abstract the state of the application. + */ +public class DashboardState extends DataDispatchRequest implements Serializable { + private HashMap params; + private String httpMethod; + + public DashboardState() { + } + + /* + Special copy constructor to instantiate DashboardState from + BodyTabController's getBasicRequest() + */ + public DashboardState(DataDispatchRequest dataDispatchRequest) { + super(); + this.setHttpMethod(dataDispatchRequest.getRequestType()); + this.setBody(dataDispatchRequest.getBody()); + this.setContentType(dataDispatchRequest.getContentType()); + this.setStringTuples(dataDispatchRequest.getStringTuples()); + this.setFileTuples(dataDispatchRequest.getFileTuples()); + } + + public void setParams(HashMap params) { + this.params = params; + } + + public HashMap getParams() { + return params; + } + + public void setHttpMethod(String httpMethod) { + this.httpMethod = httpMethod; + } + + public String getHttpMethod() { + return httpMethod; + } +} diff --git a/src/main/java/com/rohitawate/restaurant/models/requests/DataDispatchRequest.java b/src/main/java/com/rohitawate/restaurant/models/requests/DataDispatchRequest.java index 1c94c7b..d58f083 100644 --- a/src/main/java/com/rohitawate/restaurant/models/requests/DataDispatchRequest.java +++ b/src/main/java/com/rohitawate/restaurant/models/requests/DataDispatchRequest.java @@ -16,38 +16,26 @@ package com.rohitawate.restaurant.models.requests; -import java.net.MalformedURLException; -import java.net.URL; +import java.io.Serializable; import java.util.HashMap; /** * Represents HTTP requests which contain data viz. POST and PUT. */ -public class DataDispatchRequest extends RestaurantRequest { +public class DataDispatchRequest extends RestaurantRequest implements Serializable { private String requestType; private String body; private String contentType; private HashMap stringTuples; private HashMap fileTuples; + public DataDispatchRequest() { + } + public DataDispatchRequest(String requestType) { this.requestType = requestType; } - public DataDispatchRequest(URL target, String requestType) { - super(target); - this.requestType = requestType; - } - - public DataDispatchRequest(String target, String requestType) throws MalformedURLException { - super(target); - this.requestType = requestType; - } - - public void setTarget(String target) throws MalformedURLException { - this.target = new URL(target); - } - public String getBody() { return body; } diff --git a/src/main/java/com/rohitawate/restaurant/models/requests/RestaurantRequest.java b/src/main/java/com/rohitawate/restaurant/models/requests/RestaurantRequest.java index 1e28808..335f89f 100644 --- a/src/main/java/com/rohitawate/restaurant/models/requests/RestaurantRequest.java +++ b/src/main/java/com/rohitawate/restaurant/models/requests/RestaurantRequest.java @@ -22,7 +22,7 @@ import java.net.URL; import java.util.HashMap; public abstract class RestaurantRequest implements Serializable { - URL target; + private URL target; private HashMap headers; RestaurantRequest() { @@ -36,8 +36,12 @@ public abstract class RestaurantRequest implements Serializable { this.target = target; } + public void setTarget(String target) throws MalformedURLException { + this.target = new URL(target); + } + public URL getTarget() { - return target; + return this.target; } public void addHeader(String key, String value) { diff --git a/src/main/java/com/rohitawate/restaurant/util/settings/SettingsLoader.java b/src/main/java/com/rohitawate/restaurant/util/settings/SettingsLoader.java index dbe450b..c7f7285 100644 --- a/src/main/java/com/rohitawate/restaurant/util/settings/SettingsLoader.java +++ b/src/main/java/com/rohitawate/restaurant/util/settings/SettingsLoader.java @@ -60,9 +60,9 @@ public class SettingsLoader implements Runnable { Settings.theme = JSONUtils.trimString(nodes.get("theme").toString()); } catch (Exception E) { - System.out.print("Settings file not found. Loading default values... "); + System.out.println("Settings file not found. Loading default values... "); } finally { - System.out.println("Successful"); + System.out.println("Settings loaded."); } } }