diff --git a/.gitignore b/.gitignore index bbd59dd..17ed249 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,6 @@ .mtj.tmp/ # Package Files # -*.jar *.war *.nar *.ear diff --git a/lib/jackson-annotations-2.12.5.jar b/lib/jackson-annotations-2.12.5.jar new file mode 100644 index 0000000..41f1da4 Binary files /dev/null and b/lib/jackson-annotations-2.12.5.jar differ diff --git a/lib/jackson-core-2.12.5.jar b/lib/jackson-core-2.12.5.jar new file mode 100644 index 0000000..39f61af Binary files /dev/null and b/lib/jackson-core-2.12.5.jar differ diff --git a/lib/jackson-databind-2.12.5.jar b/lib/jackson-databind-2.12.5.jar new file mode 100644 index 0000000..1a524f2 Binary files /dev/null and b/lib/jackson-databind-2.12.5.jar differ diff --git a/out/production/http-server-simulator/resources/close.png b/out/production/http-server-simulator/resources/close.png new file mode 100644 index 0000000..50bd4d4 Binary files /dev/null and b/out/production/http-server-simulator/resources/close.png differ diff --git a/out/production/http-server-simulator/resources/config.json b/out/production/http-server-simulator/resources/config.json index 73b26df..fed7bf3 100644 --- a/out/production/http-server-simulator/resources/config.json +++ b/out/production/http-server-simulator/resources/config.json @@ -1,22 +1,37 @@ { - "projectName" : null, + "projectName" : "HTTP SERVER 模拟器", "width" : 1200, "height" : 800, + "stringLen" : 8, + "intLen" : 8, "serverConfigs" : [ { - "serverName" : "测试接口", - "port" : 8080, + "serverName" : "WMS", + "port" : 8082, "serverUrls" : [ { - "urlName" : "登出", - "url" : "/logout", - "requestType" : "GET", - "responseBody" : "{\n \"username\": \"admin\",\n \"password\": \"123\"\n}", + "urlName" : "登录", + "url" : "/login", + "serverName" : "WMS", + "requestType" : "POST", + "responseBody" : "{\n\t\"success\": \"$int$\"\n}", "headerMap" : null }, { - "urlName" : "查询1", - "url" : "/list1", - "requestType" : null, - "responseBody" : "{\n\t\"taskNo\": \"123\"\n}", + "urlName" : "退出", + "url" : "/logout", + "serverName" : "WMS", + "requestType" : "POST", + "responseBody" : "{\n\t\"id\": 1\n}", + "headerMap" : null + }, { + "urlName" : "登录2", + "url" : "/login22", + "serverName" : "WMS", + "requestType" : "POST", + "responseBody" : "", "headerMap" : null } ] + }, { + "serverName" : "WCS", + "port" : 8083, + "serverUrls" : [ ] } ] } \ No newline at end of file diff --git a/out/production/http-server-simulator/resources/min.png b/out/production/http-server-simulator/resources/min.png new file mode 100644 index 0000000..3fef6b8 Binary files /dev/null and b/out/production/http-server-simulator/resources/min.png differ diff --git a/out/production/http-server-simulator/resources/panda.png b/out/production/http-server-simulator/resources/panda.png new file mode 100644 index 0000000..14a4b40 Binary files /dev/null and b/out/production/http-server-simulator/resources/panda.png differ diff --git a/src/com/dayrain/ApplicationStarter.java b/src/com/dayrain/ApplicationStarter.java index 668a225..8138b83 100644 --- a/src/com/dayrain/ApplicationStarter.java +++ b/src/com/dayrain/ApplicationStarter.java @@ -1,17 +1,9 @@ package com.dayrain; -import com.dayrain.entity.Configuration; -import com.dayrain.entity.RequestType; -import com.dayrain.entity.ServerConfig; -import com.dayrain.entity.ServerUrl; -import com.dayrain.utils.FileUtils; import com.dayrain.views.HomePage; import javafx.application.Application; import javafx.stage.Stage; -import java.io.IOException; -import java.util.ArrayList; - public class ApplicationStarter extends Application { @@ -19,33 +11,9 @@ public class ApplicationStarter extends Application { launch(args); } - private static Configuration configInit() { - Configuration configuration = new Configuration(); - configuration.setServerConfigs(new ArrayList(){ - { - add(new ServerConfig("测试", 8080, new ArrayList(){ - { - add(new ServerUrl("登录", "/login", RequestType.GET, "{\n" + - " \"username\": \"admin\",\n" + - " \"password\": \"123\"\n" + - "}")); - - add(new ServerUrl("登出", "/logout", RequestType.GET, "{\n" + - " \"username\": \"admin\",\n" + - " \"password\": \"123\"\n" + - "}")); - } - })); - } - }); - configuration.setWidth(1200); - configuration.setHeight(800); - - return configuration; - } - @Override public void start(Stage primaryStage) throws Exception { new HomePage(primaryStage).start(); + } } diff --git a/src/com/dayrain/entity/ConfigHolder.java b/src/com/dayrain/component/ConfigHolder.java similarity index 77% rename from src/com/dayrain/entity/ConfigHolder.java rename to src/com/dayrain/component/ConfigHolder.java index 60abba0..2a30b40 100644 --- a/src/com/dayrain/entity/ConfigHolder.java +++ b/src/com/dayrain/component/ConfigHolder.java @@ -1,4 +1,4 @@ -package com.dayrain.entity; +package com.dayrain.component; import com.dayrain.utils.FileUtils; @@ -15,4 +15,8 @@ public class ConfigHolder { public static void save() { FileUtils.saveConfig(configuration); } + + public static Configuration get() { + return configuration; + } } diff --git a/src/com/dayrain/entity/Configuration.java b/src/com/dayrain/component/Configuration.java similarity index 54% rename from src/com/dayrain/entity/Configuration.java rename to src/com/dayrain/component/Configuration.java index b94442e..115f2b4 100644 --- a/src/com/dayrain/entity/Configuration.java +++ b/src/com/dayrain/component/Configuration.java @@ -1,17 +1,31 @@ -package com.dayrain.entity; +package com.dayrain.component; import java.util.List; public class Configuration { - private String projectName; + private String projectName = "HTTP SERVER 模拟器"; private int width; private int height; + private int stringLen; + + private int intLen; + private ListserverConfigs; + public Configuration() { + } + + public Configuration(int width, int height, int stringLen, int intLen) { + this.width = width; + this.height = height; + this.stringLen = stringLen; + this.intLen = intLen; + } + public String getProjectName() { return projectName; } @@ -43,4 +57,20 @@ public class Configuration { public void setHeight(int height) { this.height = height; } + + public int getStringLen() { + return stringLen; + } + + public void setStringLen(int stringLen) { + this.stringLen = stringLen; + } + + public int getIntLen() { + return intLen; + } + + public void setIntLen(int intLen) { + this.intLen = intLen; + } } diff --git a/src/com/dayrain/component/ConsoleLog.java b/src/com/dayrain/component/ConsoleLog.java new file mode 100644 index 0000000..2221da7 --- /dev/null +++ b/src/com/dayrain/component/ConsoleLog.java @@ -0,0 +1,75 @@ +package com.dayrain.component; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; + +public class ConsoleLog { + + private static final HashMap logs = new HashMap<>(); + + private static final String NO_REQUEST = "暂无请求"; + + private static LogArea logArea; + + public static void setTextArea(LogArea area) { + logArea = area; + } + + public static void log(ServerUrl serverUrl, String params, String resp) { + String log = logs.getOrDefault(serverUrl.getServerName(), null); + if(log == null || NO_REQUEST.equals(log)) { + log = ""; + } + + if(params == null || "".equals(params)) { + params = "空"; + } + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("[").append(now()).append("]"); + stringBuilder.append(serverUrl.getUrlName()).append(" "); + stringBuilder.append(serverUrl.getUrl()).append(" ").append(serverUrl.getRequestType().name()).append("\n"); + stringBuilder.append("参数: ").append("\n"); + stringBuilder.append(params).append("\n"); + stringBuilder.append("返回值: ").append("\n"); + stringBuilder.append(resp); + stringBuilder.append("\n\n"); + + log += stringBuilder.toString(); + logs.put(serverUrl.getServerName(), log); + + if(serverUrl.getServerName().equals(logArea.getServerName())) { + if(NO_REQUEST.equals(logArea.getText())) { + logArea.setText(log); + }else { + logArea.appendText(log); + } + logArea.setScrollTop(Double.MAX_VALUE); + } + } + + public static String getLog(String serverName) { + if(logs.containsKey(serverName)) { + return logs.get(serverName); + } + + logs.put(serverName, NO_REQUEST); + return NO_REQUEST; + } + + public static void resetTextArea(String serverName) { + if(!logs.containsKey(serverName)) { + logs.put(serverName, NO_REQUEST); + } + + logArea.setServerName(serverName); + logArea.setText(logs.get(serverName)); + logArea.appendText(""); + logArea.setScrollTop(Double.MAX_VALUE); + } + + private static String now() { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-DD-mm HH:mm:ss"); + return simpleDateFormat.format(new Date()); + } +} diff --git a/src/com/dayrain/component/LogArea.java b/src/com/dayrain/component/LogArea.java new file mode 100644 index 0000000..082ea3e --- /dev/null +++ b/src/com/dayrain/component/LogArea.java @@ -0,0 +1,15 @@ +package com.dayrain.component; + +import javafx.scene.control.TextArea; + +public class LogArea extends TextArea { + private String serverName; + + public String getServerName() { + return serverName; + } + + public void setServerName(String serverName) { + this.serverName = serverName; + } +} diff --git a/src/com/dayrain/component/RequestHandler.java b/src/com/dayrain/component/RequestHandler.java new file mode 100644 index 0000000..2b8cde0 --- /dev/null +++ b/src/com/dayrain/component/RequestHandler.java @@ -0,0 +1,96 @@ +package com.dayrain.component; + +import com.dayrain.utils.FileUtils; +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.UUID; + +public class RequestHandler implements HttpHandler { + + private static final String STRING_PATTERN = "$string$"; + private static final String INT_PATTERN = "$int$"; + + private final ServerUrl serverUrl; + + public RequestHandler(ServerUrl serverUrl) { + this.serverUrl = serverUrl; + } + + @Override + public void handle(HttpExchange exchange) throws IOException { + RequestType requestType = serverUrl.getRequestType(); + String param = null; + if(RequestType.GET.equals(requestType)) { + param = handleGetRequest(exchange); + } + + if(RequestType.POST.equals(requestType)) { + param = handlePostRequest(exchange); + } + + String resp = replaceResp(serverUrl.getResponseBody()); + + ConsoleLog.log(serverUrl, param, resp); + response(exchange, resp); + } + + private String handleGetRequest(HttpExchange exchange) { + return exchange.getRequestURI().getQuery(); + } + + private String handlePostRequest(HttpExchange exchange) { + + return FileUtils.getFromInputStream(exchange.getRequestBody()); + } + + private void response(HttpExchange exchange, String jsonBody) { + try { + exchange.sendResponseHeaders(200, jsonBody.length()); + exchange.setAttribute("Content-Type","application/json; charset=utf-8"); + OutputStream outputStream = exchange.getResponseBody(); + outputStream.write(jsonBody.getBytes(StandardCharsets.UTF_8)); + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private String replaceResp(String resp) { + + if(resp == null || "".equals(resp)) { + return resp; + } + + Configuration configuration = ConfigHolder.get(); + int stringLen = configuration.getStringLen(); + int intLen = configuration.getIntLen(); + + while (resp.contains(STRING_PATTERN)) { + resp = resp.replace(STRING_PATTERN, randomString(stringLen)); + } + + while (resp.contains(INT_PATTERN)) { + resp = resp.replace(INT_PATTERN, String.valueOf(randomInt(intLen))); + } + + return resp; + } + + private String randomString(int len) { + String res = UUID.randomUUID().toString(); + if(len > res.length()) { + len = res.length(); + } + return UUID.randomUUID().toString().substring(0, len); + } + + private int randomInt(int len) { + int res = (int) Math.pow(10, len - 1 ); + + return res + (int) (Math.pow(10, len - 1) * Math.random()); + } +} diff --git a/src/com/dayrain/entity/RequestType.java b/src/com/dayrain/component/RequestType.java similarity index 58% rename from src/com/dayrain/entity/RequestType.java rename to src/com/dayrain/component/RequestType.java index 0f4d341..c5071d2 100644 --- a/src/com/dayrain/entity/RequestType.java +++ b/src/com/dayrain/component/RequestType.java @@ -1,4 +1,4 @@ -package com.dayrain.entity; +package com.dayrain.component; public enum RequestType { GET,POST; diff --git a/src/com/dayrain/entity/Server.java b/src/com/dayrain/component/Server.java similarity index 97% rename from src/com/dayrain/entity/Server.java rename to src/com/dayrain/component/Server.java index 64e72cf..9158e36 100644 --- a/src/com/dayrain/entity/Server.java +++ b/src/com/dayrain/component/Server.java @@ -1,4 +1,4 @@ -package com.dayrain.entity; +package com.dayrain.component; import com.sun.net.httpserver.HttpServer; diff --git a/src/com/dayrain/entity/ServerConfig.java b/src/com/dayrain/component/ServerConfig.java similarity index 96% rename from src/com/dayrain/entity/ServerConfig.java rename to src/com/dayrain/component/ServerConfig.java index 22ed586..93945e7 100644 --- a/src/com/dayrain/entity/ServerConfig.java +++ b/src/com/dayrain/component/ServerConfig.java @@ -1,4 +1,4 @@ -package com.dayrain.entity; +package com.dayrain.component; import java.util.List; diff --git a/src/com/dayrain/entity/ServerUrl.java b/src/com/dayrain/component/ServerUrl.java similarity index 76% rename from src/com/dayrain/entity/ServerUrl.java rename to src/com/dayrain/component/ServerUrl.java index 8c346da..49fbb6c 100644 --- a/src/com/dayrain/entity/ServerUrl.java +++ b/src/com/dayrain/component/ServerUrl.java @@ -1,6 +1,5 @@ -package com.dayrain.entity; +package com.dayrain.component; -import java.util.HashMap; import java.util.Map; public class ServerUrl { @@ -13,6 +12,10 @@ public class ServerUrl { * 路径url */ private String url; + /** + * 服务名称 + */ + private String serverName; /** * 请求类型 */ @@ -29,7 +32,8 @@ public class ServerUrl { public ServerUrl() { } - public ServerUrl(String urlName, String url, RequestType requestType, String responseBody) { + public ServerUrl(String serverName, String urlName, String url, RequestType requestType, String responseBody) { + this.serverName = serverName; this.urlName = urlName; this.url = url; this.requestType = requestType; @@ -75,4 +79,12 @@ public class ServerUrl { public void setResponseBody(String responseBody) { this.responseBody = responseBody; } + + public String getServerName() { + return serverName; + } + + public void setServerName(String serverName) { + this.serverName = serverName; + } } diff --git a/src/com/dayrain/entity/RequestHandler.java b/src/com/dayrain/entity/RequestHandler.java deleted file mode 100644 index 466083c..0000000 --- a/src/com/dayrain/entity/RequestHandler.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.dayrain.entity; - -import com.dayrain.utils.JackSonUtils; -import com.sun.net.httpserver.Headers; -import com.sun.net.httpserver.HttpExchange; -import com.sun.net.httpserver.HttpHandler; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -public class RequestHandler implements HttpHandler { - - private final ServerUrl serverUrl; - - public RequestHandler(ServerUrl serverUrl) { - this.serverUrl = serverUrl; - } - - @Override - public void handle(HttpExchange exchange) throws IOException { - if(RequestType.GET == serverUrl.getRequestType()) { - handleGetRequest(exchange); - }else if(RequestType.POST == serverUrl.getRequestType()) { - handlePostRequest(exchange); - } - - response(exchange, serverUrl.getResponseBody()); - } - - private void handleGetRequest(HttpExchange exchange) { - String queryString = exchange.getRequestURI().getQuery(); - System.out.println(queryString); - } - - private void handlePostRequest(HttpExchange exchange) { - String requestBody = JackSonUtils.getFromInputStream(exchange.getRequestBody()); - System.out.println(requestBody); - } - - private void response(HttpExchange exchange, String jsonBody) { - try { - exchange.sendResponseHeaders(200, jsonBody.length()); - exchange.setAttribute("Content-Type","application/json; charset=utf-8"); - OutputStream outputStream = exchange.getResponseBody(); - outputStream.write(jsonBody.getBytes(StandardCharsets.UTF_8)); - outputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/com/dayrain/handle/AddServerHandler.java b/src/com/dayrain/handle/AddServerHandler.java new file mode 100644 index 0000000..ebbd975 --- /dev/null +++ b/src/com/dayrain/handle/AddServerHandler.java @@ -0,0 +1,88 @@ +package com.dayrain.handle; + +import com.dayrain.component.ConfigHolder; +import com.dayrain.component.Configuration; +import com.dayrain.component.ServerConfig; +import com.dayrain.style.ButtonFactory; +import com.dayrain.style.LabelFactory; +import com.dayrain.views.HomePage; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.stage.Modality; +import javafx.stage.Stage; + +import java.util.ArrayList; + +/** + * 添加server + * @author peng + * @date 2021/10/28 + */ +public class AddServerHandler implements EventHandler { + + private final Stage primaryStage; + + private final Configuration configuration; + + private final HomePage homePage; + + public AddServerHandler(Stage primaryStage, Configuration configuration, HomePage homePage) { + this.primaryStage = primaryStage; + this.configuration = configuration; + this.homePage = homePage; + } + + @Override + public void handle(ActionEvent event) { + Stage stage = new Stage(); + Label nameLabel = LabelFactory.getLabel("服务名称:"); + nameLabel.setPrefWidth(80); + TextField nameField = new TextField(); + Label portLabel = LabelFactory.getLabel("端口号:"); + TextField portField = new TextField(); + portField.setPrefWidth(80); + + HBox btnHBox = new HBox(); + Button saveButton = ButtonFactory.getButton("保存"); + btnHBox.getChildren().add(saveButton); + btnHBox.setAlignment(Pos.CENTER_RIGHT); + + GridPane gridPane = new GridPane(); + gridPane.add(nameLabel, 0, 0); + gridPane.add(nameField, 1, 0); + gridPane.add(portLabel, 0, 1); + gridPane.add(portField, 1, 1); + gridPane.add(btnHBox, 1, 3); + gridPane.setAlignment(Pos.CENTER); + gridPane.setHgap(20d); + gridPane.setVgap(10d); + + stage.setWidth(500); + stage.setHeight(400); + stage.initOwner(primaryStage); + stage.initModality(Modality.WINDOW_MODAL); + stage.setScene(new Scene(gridPane)); + stage.getIcons().addAll(primaryStage.getIcons()); + stage.show(); + + saveButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + String name = nameField.getText(); + String port = portField.getText(); + ServerConfig serverConfig = new ServerConfig(name, Integer.parseInt(port), new ArrayList<>()); + configuration.getServerConfigs().add(serverConfig); + homePage.refreshServerContainer(); + ConfigHolder.save(); + stage.close(); + } + }); + } +} diff --git a/src/com/dayrain/handle/AddUrlHandler.java b/src/com/dayrain/handle/AddUrlHandler.java index 9266d78..4ba90ca 100644 --- a/src/com/dayrain/handle/AddUrlHandler.java +++ b/src/com/dayrain/handle/AddUrlHandler.java @@ -1,15 +1,20 @@ package com.dayrain.handle; -import com.dayrain.entity.ConfigHolder; -import com.dayrain.entity.ServerConfig; -import com.dayrain.entity.ServerUrl; +import com.dayrain.component.ConfigHolder; +import com.dayrain.component.RequestType; +import com.dayrain.component.ServerConfig; +import com.dayrain.component.ServerUrl; import com.dayrain.server.ServerThread; +import com.dayrain.style.ButtonFactory; +import com.dayrain.style.LabelFactory; import com.dayrain.utils.ListViewHelper; +import javafx.collections.FXCollections; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; +import javafx.scene.control.ChoiceBox; import javafx.scene.control.Label; import javafx.scene.control.ListView; import javafx.scene.control.TextArea; @@ -47,39 +52,49 @@ public class AddUrlHandler implements EventHandler { @Override public void handle(ActionEvent event) { Stage stage = new Stage(); - Label nameLabel = new Label("接口名称:"); + Label nameLabel = LabelFactory.getLabel("接口名称:"); nameLabel.setPrefWidth(80); TextField nameField = new TextField(); - Label urlLabel = new Label("接口地址:"); + + Label urlLabel = LabelFactory.getLabel("接口地址:"); TextField urlField = new TextField(); urlField.setPrefWidth(80); - Label respLabel = new Label("返回结果:"); + Label methodLabel = LabelFactory.getLabel("请求方式:"); + ChoiceBoxchoiceBox = new ChoiceBox<>(); + choiceBox.setItems(FXCollections.observableArrayList("POST", "GET")); + choiceBox.setValue("POST"); + urlField.setPrefWidth(80); + + Label respLabel = LabelFactory.getLabel("返回结果:"); TextArea textArea = new TextArea(); textArea.setPrefWidth(80); HBox btnHBox = new HBox(); - Button saveButton = new Button("保存"); + Button saveButton = ButtonFactory.getButton("保存"); btnHBox.getChildren().add(saveButton); btnHBox.setAlignment(Pos.CENTER_RIGHT); GridPane gridPane = new GridPane(); - gridPane.add(nameLabel, 0, 0); - gridPane.add(nameField, 1, 0); - gridPane.add(urlLabel, 0, 1); - gridPane.add(urlField, 1, 1); - gridPane.add(respLabel, 0, 2); - gridPane.add(textArea, 1, 2); - gridPane.add(btnHBox, 1, 3); + gridPane.add(methodLabel, 0, 0); + gridPane.add(choiceBox, 1, 0); + gridPane.add(nameLabel, 0, 1); + gridPane.add(nameField, 1, 1); + gridPane.add(urlLabel, 0, 2); + gridPane.add(urlField, 1, 2); + gridPane.add(respLabel, 0, 3); + gridPane.add(textArea, 1, 3); + gridPane.add(btnHBox, 1, 4); gridPane.setAlignment(Pos.CENTER); gridPane.setHgap(20d); gridPane.setVgap(10d); - stage.setWidth(500); - stage.setHeight(400); + stage.setWidth(550); + stage.setHeight(500); stage.initOwner(primaryStage); stage.initModality(Modality.WINDOW_MODAL); stage.setScene(new Scene(gridPane)); + stage.getIcons().addAll(primaryStage.getIcons()); stage.show(); saveButton.setOnAction(new EventHandler() { @@ -95,8 +110,8 @@ public class AddUrlHandler implements EventHandler { String url = urlField.getText(); String resp = textArea.getText(); - ServerUrl serverUrl = new ServerUrl(name, url, null, resp); - + String type = choiceBox.getValue(); + ServerUrl serverUrl = new ServerUrl(serverConfig.getServerName(), name, url, type.equals(RequestType.POST.name()) ? RequestType.POST : RequestType.GET, resp); serverUrls.add(serverUrl); ServerThread serverThread = threadMap.getOrDefault(serverConfig.getServerName(), null); if(serverThread != null) { diff --git a/src/com/dayrain/handle/DeleteServerHandler.java b/src/com/dayrain/handle/DeleteServerHandler.java new file mode 100644 index 0000000..c5a7dd4 --- /dev/null +++ b/src/com/dayrain/handle/DeleteServerHandler.java @@ -0,0 +1,45 @@ +package com.dayrain.handle; + +import com.dayrain.component.ConfigHolder; +import com.dayrain.component.Configuration; +import com.dayrain.component.ServerConfig; +import com.dayrain.views.HomePage; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; +import javafx.scene.image.ImageView; +import javafx.stage.Stage; + +public class DeleteServerHandler implements EventHandler { + + private final ServerConfig serverConfig; + + private final Configuration configuration; + + private final HomePage homePage; + + public DeleteServerHandler(ServerConfig serverConfig, Configuration configuration, HomePage homePage) { + this.serverConfig = serverConfig; + this.configuration = configuration; + this.homePage = homePage; + } + + @Override + public void handle(ActionEvent event) { + Alert alert = new Alert(Alert.AlertType.CONFIRMATION); + + alert.setGraphic(new ImageView(homePage.getIcon())); + Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); + stage.getIcons().add(homePage.getIcon()); + alert.setHeaderText("是否确定删除该服务?"); + Button okButton = (Button) alert.getDialogPane().lookupButton(ButtonType.OK); + okButton.setOnAction(event1 -> { + configuration.getServerConfigs().remove(serverConfig); + homePage.refreshServerContainer(); + ConfigHolder.save(); + }); + alert.show(); + } +} diff --git a/src/com/dayrain/handle/DeleteUrlHandler.java b/src/com/dayrain/handle/DeleteUrlHandler.java index 31b47fe..c600c1b 100644 --- a/src/com/dayrain/handle/DeleteUrlHandler.java +++ b/src/com/dayrain/handle/DeleteUrlHandler.java @@ -1,15 +1,19 @@ package com.dayrain.handle; -import com.dayrain.entity.ConfigHolder; -import com.dayrain.entity.ServerConfig; -import com.dayrain.entity.ServerUrl; -import com.dayrain.server.ServerThread; +import com.dayrain.component.ConfigHolder; +import com.dayrain.component.ServerConfig; +import com.dayrain.component.ServerUrl; import com.dayrain.utils.ListViewHelper; +import com.dayrain.views.HomePage; import javafx.event.ActionEvent; import javafx.event.EventHandler; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; import javafx.scene.control.ListView; +import javafx.scene.image.ImageView; +import javafx.stage.Stage; -import java.util.HashMap; import java.util.List; /** @@ -23,22 +27,31 @@ public class DeleteUrlHandler implements EventHandler { private final ListView serverUrlListView; - private final HashMap threadMap; - private final ServerUrl serverUrl; - public DeleteUrlHandler(ServerUrl serverUrl, ServerConfig serverConfig, ListView serverUrlListView, HashMap threadMap) { + private final HomePage homePage; + + public DeleteUrlHandler(ServerUrl serverUrl, ServerConfig serverConfig, ListView serverUrlListView, HomePage homePage) { this.serverUrl = serverUrl; this.serverConfig = serverConfig; this.serverUrlListView = serverUrlListView; - this.threadMap = threadMap; + this.homePage = homePage; } @Override public void handle(ActionEvent event) { - List serverUrls = serverConfig.getServerUrls(); - serverUrls.remove(serverUrl); - ConfigHolder.save(); - ListViewHelper.deleteAndRefresh(serverUrl, serverUrlListView); + Alert alert = new Alert(Alert.AlertType.CONFIRMATION); + alert.setGraphic(new ImageView(homePage.getIcon())); + Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); + stage.getIcons().add(homePage.getIcon()); + alert.setHeaderText("是否确定删除该接口?"); + Button okButton = (Button) alert.getDialogPane().lookupButton(ButtonType.OK); + okButton.setOnAction(event1 -> { + List serverUrls = serverConfig.getServerUrls(); + serverUrls.remove(serverUrl); + ConfigHolder.save(); + ListViewHelper.deleteAndRefresh(serverUrl, serverUrlListView); + }); + alert.show(); } } diff --git a/src/com/dayrain/handle/ExportConfigHandler.java b/src/com/dayrain/handle/ExportConfigHandler.java new file mode 100644 index 0000000..d9d570c --- /dev/null +++ b/src/com/dayrain/handle/ExportConfigHandler.java @@ -0,0 +1,45 @@ +package com.dayrain.handle; + +import com.dayrain.component.Configuration; +import com.dayrain.utils.FileUtils; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.stage.FileChooser; +import javafx.stage.Stage; + +import java.io.File; + +/** + * 导出配置文件 + * @author peng + * @date 2021/10/28 + */ +public class ExportConfigHandler implements EventHandler { + + private final Stage primaryStage; + + private final Configuration configuration; + + public ExportConfigHandler(Stage primaryStage, Configuration configuration) { + this.primaryStage = primaryStage; + this.configuration = configuration; + } + + @Override + public void handle(ActionEvent event) { + Stage stage = new Stage(); + stage.initOwner(primaryStage); + FileChooser fileChooser = new FileChooser(); + String projectName = configuration.getProjectName(); + if(projectName == null) { + projectName = ""; + } + projectName += "server"; + fileChooser.setTitle("导出配置"); + fileChooser.setInitialFileName(projectName + ".json"); + File file = fileChooser.showSaveDialog(stage); + if(file != null) { + FileUtils.saveConfig(configuration, file); + } + } +} diff --git a/src/com/dayrain/handle/ImportConfigHandler.java b/src/com/dayrain/handle/ImportConfigHandler.java new file mode 100644 index 0000000..65978c3 --- /dev/null +++ b/src/com/dayrain/handle/ImportConfigHandler.java @@ -0,0 +1,46 @@ +package com.dayrain.handle; + +import com.dayrain.component.Configuration; +import com.dayrain.utils.FileUtils; +import com.dayrain.views.HomePage; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.stage.FileChooser; +import javafx.stage.Stage; + +import java.io.File; + +/** + * 导入配置文件 + * @author peng + * @date 2021/10/28 + */ +public class ImportConfigHandler implements EventHandler { + + private final Stage primaryStage; + + private final HomePage homePage; + + public ImportConfigHandler(Stage primaryStage, HomePage homePage) { + this.primaryStage = primaryStage; + this.homePage = homePage; + } + + @Override + public void handle(ActionEvent event) { + Stage stage = new Stage(); + stage.initOwner(primaryStage); + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle("选择一个文件"); + //过滤器 + fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("只能导入json文件", "*.json")); + File file = fileChooser.showOpenDialog(stage); + + if(file != null) { + Configuration loadConfig = FileUtils.load(file); + FileUtils.saveConfig(loadConfig); + homePage.replaceConfig(loadConfig); + homePage.restart(); + } + } +} diff --git a/src/com/dayrain/handle/StartServerHandler.java b/src/com/dayrain/handle/StartServerHandler.java index bdaba6f..2e1127e 100644 --- a/src/com/dayrain/handle/StartServerHandler.java +++ b/src/com/dayrain/handle/StartServerHandler.java @@ -1,7 +1,7 @@ package com.dayrain.handle; -import com.dayrain.entity.Server; -import com.dayrain.entity.ServerConfig; +import com.dayrain.component.Server; +import com.dayrain.component.ServerConfig; import com.dayrain.server.ServerThread; import javafx.event.ActionEvent; import javafx.event.EventHandler; diff --git a/src/com/dayrain/handle/UpdateRandomLenHandler.java b/src/com/dayrain/handle/UpdateRandomLenHandler.java new file mode 100644 index 0000000..5a0c930 --- /dev/null +++ b/src/com/dayrain/handle/UpdateRandomLenHandler.java @@ -0,0 +1,76 @@ +package com.dayrain.handle; + +import com.dayrain.component.ConfigHolder; +import com.dayrain.component.Configuration; +import com.dayrain.component.ServerConfig; +import com.dayrain.style.ButtonFactory; +import com.dayrain.style.LabelFactory; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.stage.Modality; +import javafx.stage.Stage; + +public class UpdateRandomLenHandler implements EventHandler { + + private final Stage primaryStage; + + public UpdateRandomLenHandler(Stage primaryStage) { + this.primaryStage = primaryStage; + } + + @Override + public void handle(ActionEvent event) { + Configuration configuration = ConfigHolder.get(); + Stage stage = new Stage(); + Label strName = LabelFactory.getLabel("随机字符长度:"); + strName.setPrefWidth(80); + TextField strField = new TextField(String.valueOf(configuration.getStringLen())); + Label intName = LabelFactory.getLabel("随机整数长度:"); + TextField intField = new TextField(String.valueOf(configuration.getIntLen())); + intField.setPrefWidth(80); + + HBox btnHBox = new HBox(); + Button saveButton = ButtonFactory.getButton("保存"); + btnHBox.getChildren().addAll(saveButton); + btnHBox.setAlignment(Pos.CENTER_RIGHT); + btnHBox.setSpacing(20d); + + GridPane gridPane = new GridPane(); + gridPane.add(strName, 0, 0); + gridPane.add(strField, 1, 0); + gridPane.add(intName, 0, 1); + gridPane.add(intField, 1, 1); + + gridPane.add(btnHBox, 1, 3); + gridPane.setAlignment(Pos.CENTER); + gridPane.setHgap(20d); + gridPane.setVgap(10d); + + stage.setWidth(500); + stage.setHeight(400); + stage.initOwner(primaryStage); + stage.initModality(Modality.WINDOW_MODAL); + stage.setScene(new Scene(gridPane)); + stage.getIcons().addAll(primaryStage.getIcons()); + stage.show(); + + saveButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + String strLen = strField.getText(); + String intLen = intField.getText(); + configuration.setStringLen(Integer.parseInt(strLen)); + configuration.setIntLen(Integer.parseInt(intLen)); + ConfigHolder.save(); + stage.close(); + } + }); + } +} diff --git a/src/com/dayrain/handle/UpdateServerConfigHandler.java b/src/com/dayrain/handle/UpdateServerConfigHandler.java index 86168e4..c095e0c 100644 --- a/src/com/dayrain/handle/UpdateServerConfigHandler.java +++ b/src/com/dayrain/handle/UpdateServerConfigHandler.java @@ -1,8 +1,9 @@ package com.dayrain.handle; -import com.dayrain.entity.ConfigHolder; -import com.dayrain.entity.ServerConfig; -import com.dayrain.utils.ListViewHelper; +import com.dayrain.component.ConfigHolder; +import com.dayrain.component.ServerConfig; +import com.dayrain.style.ButtonFactory; +import com.dayrain.style.LabelFactory; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Pos; @@ -29,17 +30,16 @@ public class UpdateServerConfigHandler implements EventHandler { @Override public void handle(ActionEvent event) { Stage stage = new Stage(); - Label serverName = new Label("服务名称:"); + Label serverName = LabelFactory.getLabel("服务名称:"); serverName.setPrefWidth(80); TextField nameField = new TextField(serverConfig.getServerName()); - Label portLabel = new Label("端口:"); + Label portLabel = LabelFactory.getLabel("端口:"); TextField portField = new TextField(String.valueOf(serverConfig.getPort())); portField.setPrefWidth(80); HBox btnHBox = new HBox(); - Label saveTips = new Label("重启后生效"); - saveTips.setStyle("-fx-background-color: #ff0000"); - Button saveButton = new Button("保存"); + Label saveTips = LabelFactory.getLabel("重启后生效"); + Button saveButton = ButtonFactory.getButton("保存"); btnHBox.getChildren().addAll(saveTips, saveButton); btnHBox.setAlignment(Pos.CENTER_RIGHT); btnHBox.setSpacing(20d); @@ -55,11 +55,12 @@ public class UpdateServerConfigHandler implements EventHandler { gridPane.setHgap(20d); gridPane.setVgap(10d); - stage.setWidth(400); - stage.setHeight(300); + stage.setWidth(500); + stage.setHeight(400); stage.initOwner(primaryStage); stage.initModality(Modality.WINDOW_MODAL); stage.setScene(new Scene(gridPane)); + stage.getIcons().addAll(primaryStage.getIcons()); stage.show(); saveButton.setOnAction(new EventHandler() { diff --git a/src/com/dayrain/handle/UpdateUrlHandler.java b/src/com/dayrain/handle/UpdateUrlHandler.java index ef9ec34..b1c26fc 100644 --- a/src/com/dayrain/handle/UpdateUrlHandler.java +++ b/src/com/dayrain/handle/UpdateUrlHandler.java @@ -1,15 +1,18 @@ package com.dayrain.handle; -import com.dayrain.entity.ConfigHolder; -import com.dayrain.entity.ServerConfig; -import com.dayrain.entity.ServerUrl; -import com.dayrain.server.ServerThread; +import com.dayrain.component.ConfigHolder; +import com.dayrain.component.RequestType; +import com.dayrain.component.ServerUrl; +import com.dayrain.style.ButtonFactory; +import com.dayrain.style.LabelFactory; import com.dayrain.utils.ListViewHelper; +import javafx.collections.FXCollections; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; +import javafx.scene.control.ChoiceBox; import javafx.scene.control.Label; import javafx.scene.control.ListView; import javafx.scene.control.TextArea; @@ -19,7 +22,6 @@ import javafx.scene.layout.HBox; import javafx.stage.Modality; import javafx.stage.Stage; -import java.util.HashMap; public class UpdateUrlHandler implements EventHandler { @@ -38,42 +40,51 @@ public class UpdateUrlHandler implements EventHandler { @Override public void handle(ActionEvent event) { Stage stage = new Stage(); - Label nameLabel = new Label("接口名称:"); + Label nameLabel = LabelFactory.getLabel("接口名称:"); nameLabel.setPrefWidth(80); TextField nameField = new TextField(serverUrl.getUrlName()); - Label urlLabel = new Label("接口地址:"); + Label urlLabel = LabelFactory.getLabel("接口地址:"); TextField urlField = new TextField(serverUrl.getUrl()); + urlField.setEditable(false); urlField.setPrefWidth(80); - Label respLabel = new Label("返回结果:"); + Label methodLabel = LabelFactory.getLabel("请求方式:"); + ChoiceBox choiceBox = new ChoiceBox<>(); + choiceBox.setItems(FXCollections.observableArrayList("POST", "GET")); + choiceBox.setValue("POST"); + urlField.setPrefWidth(80); + + Label respLabel = LabelFactory.getLabel("返回结果:"); TextArea textArea = new TextArea(serverUrl.getResponseBody()); textArea.setPrefWidth(80); HBox btnHBox = new HBox(); - Label saveTips = new Label("重启后生效"); - saveTips.setStyle("-fx-background-color: #ff0000"); - Button saveButton = new Button("保存"); - btnHBox.getChildren().addAll(saveTips, saveButton); + + Button saveButton = ButtonFactory.getButton("保存"); + btnHBox.getChildren().addAll(saveButton); btnHBox.setAlignment(Pos.CENTER_RIGHT); btnHBox.setSpacing(20d); GridPane gridPane = new GridPane(); - gridPane.add(nameLabel, 0, 0); - gridPane.add(nameField, 1, 0); - gridPane.add(urlLabel, 0, 1); - gridPane.add(urlField, 1, 1); - gridPane.add(respLabel, 0, 2); - gridPane.add(textArea, 1, 2); - gridPane.add(btnHBox, 1, 3); + gridPane.add(methodLabel, 0, 0); + gridPane.add(choiceBox, 1, 0); + gridPane.add(nameLabel, 0, 1); + gridPane.add(nameField, 1, 1); + gridPane.add(urlLabel, 0, 2); + gridPane.add(urlField, 1, 2); + gridPane.add(respLabel, 0, 3); + gridPane.add(textArea, 1, 3); + gridPane.add(btnHBox, 1, 4); gridPane.setAlignment(Pos.CENTER); gridPane.setHgap(20d); gridPane.setVgap(10d); - stage.setWidth(500); - stage.setHeight(400); + stage.setWidth(550); + stage.setHeight(450); stage.initOwner(primaryStage); stage.initModality(Modality.WINDOW_MODAL); stage.setScene(new Scene(gridPane)); + stage.getIcons().addAll(primaryStage.getIcons()); stage.show(); saveButton.setOnAction(new EventHandler() { @@ -82,9 +93,11 @@ public class UpdateUrlHandler implements EventHandler { String name = nameField.getText(); String url = urlField.getText(); String resp = textArea.getText(); + String type = choiceBox.getValue(); serverUrl.setUrlName(name); serverUrl.setUrl(url); serverUrl.setResponseBody(resp); + serverUrl.setRequestType(type.equals(RequestType.POST.name()) ? RequestType.POST : RequestType.GET); ListViewHelper.refresh(serverUrlListView); ConfigHolder.save(); diff --git a/src/com/dayrain/server/ServerThread.java b/src/com/dayrain/server/ServerThread.java index 3c9cdb7..c75a853 100644 --- a/src/com/dayrain/server/ServerThread.java +++ b/src/com/dayrain/server/ServerThread.java @@ -1,7 +1,7 @@ package com.dayrain.server; -import com.dayrain.entity.Server; -import com.dayrain.entity.ServerUrl; +import com.dayrain.component.Server; +import com.dayrain.component.ServerUrl; public class ServerThread extends Thread { private final Server server; diff --git a/src/com/dayrain/style/ButtonFactory.java b/src/com/dayrain/style/ButtonFactory.java new file mode 100644 index 0000000..79fe9c3 --- /dev/null +++ b/src/com/dayrain/style/ButtonFactory.java @@ -0,0 +1,26 @@ +package com.dayrain.style; + +import javafx.geometry.Insets; +import javafx.scene.control.Button; +import javafx.scene.layout.Background; +import javafx.scene.layout.BackgroundFill; +import javafx.scene.layout.CornerRadii; +import javafx.scene.paint.Color; +import javafx.scene.paint.Paint; +import javafx.scene.text.Font; + +public class ButtonFactory { + + public static Button getButton(String text) { + + BackgroundFill bgf = new BackgroundFill(Paint.valueOf("#145b7d"), new CornerRadii(10), new Insets(5)); + Button button = new Button(); + button.setText(text); + button.setPrefWidth(100); + button.setPrefHeight(50); + button.setFont(Font.font("Microsoft YaHei",15)); + button.setTextFill(Color.WHITE); + button.setBackground(new Background(bgf)); + return button; + } +} diff --git a/src/com/dayrain/style/LabelFactory.java b/src/com/dayrain/style/LabelFactory.java new file mode 100644 index 0000000..e56b0ae --- /dev/null +++ b/src/com/dayrain/style/LabelFactory.java @@ -0,0 +1,13 @@ +package com.dayrain.style; + +import javafx.scene.control.Label; +import javafx.scene.text.Font; + +public class LabelFactory { + + public static Label getLabel(String text) { + Label label = new Label(text); + label.setFont(Font.font("Microsoft YaHei",18)); + return label; + } +} diff --git a/src/com/dayrain/utils/FileUtils.java b/src/com/dayrain/utils/FileUtils.java index 25cc726..0904f14 100644 --- a/src/com/dayrain/utils/FileUtils.java +++ b/src/com/dayrain/utils/FileUtils.java @@ -1,21 +1,27 @@ package com.dayrain.utils; -import com.dayrain.entity.Configuration; +import com.dayrain.component.Configuration; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.BufferedReader; +import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; public class FileUtils{ - private static String configPath = Thread.currentThread().getContextClassLoader().getResource("resources/config.json").getFile(); + private static String configPath = getResourcePath("config.json"); public static void saveConfig(Configuration configuration){ + saveConfig(configuration, new File(configPath)); + } + + public static void saveConfig(Configuration configuration, File file){ FileWriter fileWriter = null; try { - fileWriter = new FileWriter(configPath); + fileWriter = new FileWriter(file); String config = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(configuration); fileWriter.write(config); fileWriter.flush(); @@ -30,19 +36,22 @@ public class FileUtils{ e.printStackTrace(); } } - } public static Configuration load() { + return load(new File(configPath)); + } + + public static Configuration load(File file) { BufferedReader bufferedReader = null; try { StringBuilder configStr = new StringBuilder(); - bufferedReader = new BufferedReader(new FileReader(configPath)); + bufferedReader = new BufferedReader(new FileReader(file)); String buf = null; while ((buf = bufferedReader.readLine()) != null) { configStr.append(buf); } - return new ObjectMapper().readValue(configStr.toString(), Configuration.class); + return "".equals(configStr.toString()) ? new Configuration(1200, 800, 8, 8) : new ObjectMapper().readValue(configStr.toString(), Configuration.class); } catch (IOException e) { e.printStackTrace(); }finally { @@ -56,4 +65,31 @@ public class FileUtils{ } return null; } + + public static String getFromInputStream(InputStream inputStream) { + try { + byte[]buf = new byte[4096]; + int len = 0; + StringBuilder stringBuilder = new StringBuilder(); + while ((len = inputStream.read(buf)) != -1) { + stringBuilder.append(new String(buf, 0, len)); + } + return stringBuilder.toString(); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + public static String getResourcePath(String fileName) { + String file = Thread.currentThread().getContextClassLoader().getResource("resources/" + fileName).getFile(); + return new File(file).toString(); + } + + public static String getResourcePathWithProtocol(String fileName) { + String file = Thread.currentThread().getContextClassLoader().getResource("resources/" + fileName).getFile(); + return "file:" + File.separator + new File(file); + } + } diff --git a/src/com/dayrain/utils/JackSonUtils.java b/src/com/dayrain/utils/JackSonUtils.java deleted file mode 100644 index 1b4b8c3..0000000 --- a/src/com/dayrain/utils/JackSonUtils.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dayrain.utils; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.io.IOException; -import java.io.InputStream; - -public class JackSonUtils { - - public static String getFromInputStream(InputStream inputStream) { - try { - return new ObjectMapper().readValue(inputStream, String.class); - } catch (IOException e) { - e.printStackTrace(); - } - - return null; - } -} diff --git a/src/com/dayrain/utils/ListViewHelper.java b/src/com/dayrain/utils/ListViewHelper.java index f6487d8..641ed27 100644 --- a/src/com/dayrain/utils/ListViewHelper.java +++ b/src/com/dayrain/utils/ListViewHelper.java @@ -1,6 +1,6 @@ package com.dayrain.utils; -import com.dayrain.entity.ServerUrl; +import com.dayrain.component.ServerUrl; import javafx.collections.ObservableList; import javafx.scene.control.ListView; diff --git a/src/com/dayrain/views/HomePage.java b/src/com/dayrain/views/HomePage.java index 01ba83a..c8e439e 100644 --- a/src/com/dayrain/views/HomePage.java +++ b/src/com/dayrain/views/HomePage.java @@ -1,20 +1,28 @@ package com.dayrain.views; -import com.dayrain.entity.ConfigHolder; -import com.dayrain.entity.Configuration; -import com.dayrain.entity.Server; -import com.dayrain.entity.ServerConfig; -import com.dayrain.entity.ServerUrl; +import com.dayrain.handle.UpdateRandomLenHandler; +import com.dayrain.style.ButtonFactory; +import com.dayrain.component.ConfigHolder; +import com.dayrain.component.Configuration; +import com.dayrain.component.ConsoleLog; +import com.dayrain.component.LogArea; +import com.dayrain.component.ServerConfig; +import com.dayrain.component.ServerUrl; +import com.dayrain.handle.AddServerHandler; import com.dayrain.handle.AddUrlHandler; +import com.dayrain.handle.DeleteServerHandler; import com.dayrain.handle.DeleteUrlHandler; +import com.dayrain.handle.ExportConfigHandler; +import com.dayrain.handle.ImportConfigHandler; import com.dayrain.handle.StartServerHandler; import com.dayrain.handle.UpdateServerConfigHandler; import com.dayrain.handle.UpdateUrlHandler; import com.dayrain.server.ServerThread; +import com.dayrain.style.LabelFactory; import com.dayrain.utils.FileUtils; +import javafx.beans.binding.Bindings; import javafx.collections.FXCollections; import javafx.collections.ObservableList; -import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -26,19 +34,23 @@ import javafx.scene.control.ListView; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; -import javafx.scene.control.TextArea; -import javafx.scene.control.TextField; import javafx.scene.control.TitledPane; +import javafx.scene.image.Image; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.Background; +import javafx.scene.layout.BackgroundFill; import javafx.scene.layout.BorderPane; -import javafx.scene.layout.GridPane; +import javafx.scene.layout.CornerRadii; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; +import javafx.scene.text.Font; import javafx.stage.Stage; -import javafx.stage.WindowEvent; import javafx.util.Callback; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -47,12 +59,16 @@ public class HomePage { private Stage primaryStage; - private final Configuration configuration = ConfigHolder.init(); + private Configuration configuration = ConfigHolder.init(); private HashMap threadMap = new HashMap<>(); private List> listViews = new ArrayList<>(); + private VBox serverContainer; + + private LogArea logArea; + public HomePage(Stage primaryStage) { this.primaryStage = primaryStage; } @@ -68,48 +84,62 @@ public class HomePage { MenuItem menuItem2 = new MenuItem("导入"); MenuItem menuItem3 = new MenuItem("导出"); menu1.getItems().addAll(menuItem1, menuItem2, menuItem3); - - Menu menu2 = new Menu("日志"); + Menu menu2 = new Menu("设置"); + MenuItem menuItem21 = new MenuItem("随机值长度"); + menu2.getItems().add(menuItem21); Menu menu3 = new Menu("帮助"); - menuBar.getMenus().addAll(menu1, menu2, menu3); + menuBar.getMenus().addAll(menu1, menu2, menu3); borderPane.setTop(menuBar); //渲染服务列表 - VBox serverContainer = new VBox(); - - List serverConfigs = configuration.getServerConfigs(); - - for (ServerConfig serverConfig : serverConfigs) { - drawServerPanel(serverContainer, serverConfig, primaryStage); - } + this.serverContainer = new VBox(); + refreshServerContainer(); + menuItem1.setOnAction(new AddServerHandler(primaryStage, configuration, this)); + menuItem2.setOnAction(new ImportConfigHandler(primaryStage, this)); + menuItem3.setOnAction(new ExportConfigHandler(primaryStage, configuration)); + menuItem21.setOnAction(new UpdateRandomLenHandler(primaryStage)); borderPane.setLeft(serverContainer); - primaryStage.setScene(new Scene(borderPane)); + + //日志 + logArea = new LogArea(); + logArea.setEditable(false); + logArea.setFont(Font.font("Microsoft YaHei", 20)); + logArea.setPrefWidth(582); + logArea.setPrefHeight(600); + + ConsoleLog.setTextArea(logArea); + + borderPane.setRight(logArea); + + menuBar.setBackground(getBackGround()); + + Scene scene = new Scene(borderPane); + primaryStage.setTitle(configuration.getProjectName()); + primaryStage.setScene(scene); primaryStage.setWidth(configuration.getWidth()); primaryStage.setHeight(configuration.getHeight()); + primaryStage.getIcons().add(getIcon()); primaryStage.show(); - primaryStage.setOnCloseRequest(new EventHandler() { - @Override - public void handle(WindowEvent event) { - FileUtils.saveConfig(configuration); - } - }); + primaryStage.setOnCloseRequest(event -> FileUtils.saveConfig(configuration)); } public void drawServerPanel(VBox serverContainer, ServerConfig serverConfig, Stage primaryStage) { VBox vBox = new VBox(); HBox headBox = new HBox(); - Button editButton = new Button("配置参数"); - Button openButton = new Button("开启服务"); - Button addButton = new Button("添加接口"); + Button editButton = ButtonFactory.getButton("修改配置"); + Button openButton = ButtonFactory.getButton("开启服务"); + Button deleteButton = ButtonFactory.getButton("删除服务"); + Button addButton = ButtonFactory.getButton("添加接口"); Circle statusCircle = new Circle(); statusCircle.setRadius(10); statusCircle.setFill(Color.RED); //设置服务启动与关闭 openButton.setOnAction(new StartServerHandler(openButton, statusCircle, serverConfig, threadMap)); editButton.setOnAction(new UpdateServerConfigHandler(serverConfig, primaryStage)); - headBox.getChildren().addAll(openButton, editButton, addButton, statusCircle); + deleteButton.setOnAction(new DeleteServerHandler(serverConfig, configuration, this)); + headBox.getChildren().addAll(openButton, editButton, deleteButton, addButton, statusCircle); HBox.setMargin(statusCircle, new Insets(0,0,0,30)); headBox.setSpacing(20d); headBox.setAlignment(Pos.CENTER); @@ -122,14 +152,30 @@ public class HomePage { VBox.setMargin(headBox, new Insets(10, 0, 0, 0)); vBox.setPadding(Insets.EMPTY); TitledPane titledPane = new TitledPane(serverConfig.getServerName(), vBox); + titledPane.setFont(Font.font("Microsoft YaHei", 18)); titledPane.setPrefWidth(600d); + titledPane.setExpanded(false); + titledPane.setBackground(getBackGround()); + titledPane.setOnMouseClicked(new EventHandler() { + @Override + public void handle(MouseEvent event) { + if(!serverConfig.getServerName().equals(logArea.getServerName())) { + ConsoleLog.resetTextArea(serverConfig.getServerName()); + } + } + }); + + HBox hBox = new HBox(); + hBox.setPrefHeight(60d); + titledPane.setGraphic(hBox); + serverContainer.getChildren().add(titledPane); } public ListView drawUrlPanel(List serverUrls, ServerConfig serverConfig) { ObservableList urlList = FXCollections.observableArrayList(serverUrls); ListView serverListViews = new ListView<>(urlList); - listViews.add(serverListViews); + serverListViews.setCellFactory(new Callback, ListCell>() { @Override public ListCell call(ListView param) { @@ -145,24 +191,26 @@ public class HomePage { BorderPane urlPane = new BorderPane(); HBox labelBox = new HBox(); - Label nameLabel = new Label(item.getUrlName()); + Label nameLabel = LabelFactory.getLabel(item.getUrlName()); nameLabel.setPrefWidth(100d); - Label urlLabel = new Label(item.getUrl()); + Label urlLabel = LabelFactory.getLabel(item.getUrl()); labelBox.getChildren().addAll(nameLabel, urlLabel); labelBox.setAlignment(Pos.CENTER_LEFT); HBox btnBox = new HBox(); - Button configButton = new Button("配置"); - Button deleteButton = new Button("删除"); + Button configButton = ButtonFactory.getButton("配置"); + Button deleteButton = ButtonFactory.getButton("删除"); btnBox.setSpacing(15d); btnBox.getChildren().addAll(configButton, deleteButton); + HBox.setMargin(deleteButton, new Insets(0, 20,0,0)); - deleteButton.setOnAction(new DeleteUrlHandler(item, serverConfig, serverListViews, threadMap)); + deleteButton.setOnAction(new DeleteUrlHandler(item, serverConfig, serverListViews, HomePage.this)); configButton.setOnAction(new UpdateUrlHandler(item, serverListViews, primaryStage)); urlPane.setLeft(labelBox); urlPane.setRight(btnBox); this.setGraphic(urlPane); + } } }; @@ -170,7 +218,52 @@ public class HomePage { } }); + serverListViews.prefHeightProperty().bind(Bindings.size(urlList).multiply(60)); + serverListViews.setFocusTraversable(false); + return serverListViews; } + public void refreshServerContainer() { + serverContainer.getChildren().removeAll(serverContainer.getChildren()); + List serverConfigs = configuration.getServerConfigs(); + if(serverConfigs == null || serverConfigs.size() == 0) { + serverConfigs = new ArrayList<>(); + configuration.setServerConfigs(serverConfigs); + } + + for (ServerConfig serverConfig : serverConfigs) { + drawServerPanel(serverContainer, serverConfig, primaryStage); + } + } + + public void restart() { + cleanUp(); + start(); + } + + public void cleanUp() { + for (String name : threadMap.keySet()) { + threadMap.get(name).stopServer(); + } + } + + public void replaceConfig(Configuration configuration) { + this.configuration = configuration; + } + + public Image getIcon() { + try { + return new Image(new FileInputStream(FileUtils.getResourcePath("panda.png"))); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + return null; + } + + public Background getBackGround() { + BackgroundFill backgroundFill = new BackgroundFill(Color.GRAY, new CornerRadii(1), + new Insets(0.0,0.0,0.0,0.0)); + return new Background(backgroundFill); + } } diff --git a/src/resources/close.png b/src/resources/close.png new file mode 100644 index 0000000..50bd4d4 Binary files /dev/null and b/src/resources/close.png differ diff --git a/src/resources/config.json b/src/resources/config.json index e69de29..02dffd5 100644 --- a/src/resources/config.json +++ b/src/resources/config.json @@ -0,0 +1,21 @@ +{ + "projectName" : "HTTP SERVER 模拟器", + "width" : 1200, + "height" : 800, + "serverConfigs" : [ { + "serverName" : "WMS", + "port" : 8082, + "serverUrls" : [ { + "urlName" : "登录", + "url" : "/login", + "serverName" : "WMS", + "requestType" : "POST", + "responseBody" : "{\n\t\"success\": \"ok\"\n}", + "headerMap" : null + } ] + }, { + "serverName" : "WCS", + "port" : 8083, + "serverUrls" : [ ] + } ] +} \ No newline at end of file diff --git a/src/resources/min.png b/src/resources/min.png new file mode 100644 index 0000000..3fef6b8 Binary files /dev/null and b/src/resources/min.png differ diff --git a/src/resources/panda.png b/src/resources/panda.png new file mode 100644 index 0000000..14a4b40 Binary files /dev/null and b/src/resources/panda.png differ