From 6b80186574461a644d52bdb836a7c4485f0d6b56 Mon Sep 17 00:00:00 2001 From: owpk Date: Sun, 9 Aug 2020 01:51:05 +0900 Subject: [PATCH 01/31] JPA + Auth + slf4j2 logger --- .gitignore | 1 + client.properties | 2 +- client/pom.xml | 12 ++ .../org/owpk/IODataHandler/AuthHandler.java | 68 ++++++++++++ .../IODataHandler/IONetworkServiceImpl.java | 105 ++++++++++++++++++ .../InputDataHandler.java | 36 +++--- .../main/java/org/owpk/app/ClientConfig.java | 9 +- .../controller/ClientPanelController.java | 52 +++------ .../owpk/controller/CloudPanelController.java | 25 +++-- .../owpk/controller/MainSceneController.java | 2 +- .../java/org/owpk/controller/UserDialog.java | 53 ++++++++- .../owpk/network/IONetworkServiceImpl.java | 69 ------------ .../owpk/network/NetworkServiceFactory.java | 10 +- .../org/owpk/network/NetworkServiceInt.java | 10 +- .../src/main/resources/view/client_panel.fxml | 9 ++ .../src/main/resources/view/cloud_panel.fxml | 9 ++ logs/logfile.log | 1 + .../java/org/owpk/message/MessageType.java | 3 + .../main/java/org/owpk/message/UserInfo.java | 16 +++ .../src/main/java/org/owpk/util/Config.java | 3 +- .../main/java/org/owpk/util/FileUtility.java | 8 +- .../org/owpk/message/MessageType.class | Bin 1631 -> 1780 bytes .../classes/org/owpk/message/UserInfo.class | Bin 0 -> 2121 bytes .../owpk/util/Config$ConfigParameters.class | Bin 1625 -> 1703 bytes .../target/classes/org/owpk/util/Config.class | Bin 2179 -> 2179 bytes .../classes/org/owpk/util/FileUtility.class | Bin 7039 -> 6619 bytes pom.xml | 15 ++- server.properties | 3 +- server/pom.xml | 10 ++ .../main/java/org/owpk/auth/AuthService.java | 4 - server/src/main/java/org/owpk/auth/User.java | 8 +- .../src/main/java/org/owpk/auth/UserDAO.java | 26 +++++ .../main/java/org/owpk/core/AuthHandler.java | 55 +++++++++ .../java/org/owpk/core/ClientHandler.java | 4 - .../java/org/owpk/core/MessageHandler.java | 54 +++++---- .../main/java/org/owpk/{ => core}/Server.java | 15 ++- .../main/java/org/owpk/util/ServerConfig.java | 16 ++- .../main/resources/META-INF/persistence.xml | 27 +++++ server/src/main/resources/log4j2.xml | 0 39 files changed, 536 insertions(+), 204 deletions(-) create mode 100644 client/src/main/java/org/owpk/IODataHandler/AuthHandler.java create mode 100644 client/src/main/java/org/owpk/IODataHandler/IONetworkServiceImpl.java rename client/src/main/java/org/owpk/{network => IODataHandler}/InputDataHandler.java (74%) delete mode 100644 client/src/main/java/org/owpk/network/IONetworkServiceImpl.java create mode 100644 logs/logfile.log create mode 100644 network/src/main/java/org/owpk/message/UserInfo.java create mode 100644 network/target/classes/org/owpk/message/UserInfo.class delete mode 100644 server/src/main/java/org/owpk/auth/AuthService.java create mode 100644 server/src/main/java/org/owpk/auth/UserDAO.java create mode 100644 server/src/main/java/org/owpk/core/AuthHandler.java delete mode 100644 server/src/main/java/org/owpk/core/ClientHandler.java rename server/src/main/java/org/owpk/{ => core}/Server.java (83%) create mode 100644 server/src/main/resources/META-INF/persistence.xml create mode 100644 server/src/main/resources/log4j2.xml diff --git a/.gitignore b/.gitignore index a454f8e..318c9fb 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ #/client/downloads/ /server/target /server/out +/server/log/ *.iml \ No newline at end of file diff --git a/client.properties b/client.properties index bf42cc3..0bca487 100644 --- a/client.properties +++ b/client.properties @@ -1,5 +1,5 @@ #root_directory -#Fri Aug 07 22:50:37 YAKT 2020 +#Sun Aug 09 01:49:29 YAKT 2020 default_server=localhost download_directory=./client/downloads/ port=8190 diff --git a/client/pom.xml b/client/pom.xml index c9e6176..7a6a8ed 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -10,7 +10,19 @@ 4.0.0 client + jar + + + 1.11 + + + + commons-codec + commons-codec + ${commos.codec.version} + + org.owpk network diff --git a/client/src/main/java/org/owpk/IODataHandler/AuthHandler.java b/client/src/main/java/org/owpk/IODataHandler/AuthHandler.java new file mode 100644 index 0000000..286d1bc --- /dev/null +++ b/client/src/main/java/org/owpk/IODataHandler/AuthHandler.java @@ -0,0 +1,68 @@ +package org.owpk.IODataHandler; + +import io.netty.handler.codec.serialization.ObjectDecoderInputStream; +import io.netty.handler.codec.serialization.ObjectEncoderOutputStream; +import javafx.util.Pair; +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.codec.digest.DigestUtils; +import org.owpk.controller.UserDialog; +import org.owpk.message.Message; +import org.owpk.message.MessageType; +import org.owpk.message.UserInfo; +import org.owpk.network.NetworkServiceInt; + +import java.io.IOException; +import java.util.Optional; + +@Getter +@Setter +public class AuthHandler { + private String login; + private String password; + + private static String hash(String input) { + return DigestUtils.sha256Hex(input); + } + + public boolean tryToAuth() { + Optional> result = UserDialog.loginDialog(); + result.ifPresent(usernamePassword -> { + login = usernamePassword.getKey(); + password = usernamePassword.getValue(); + }); + login = "user"; + password = "178ueee34"; + if (result.isPresent()) { + try { + NetworkServiceInt serviceInt = IONetworkServiceImpl.getService(); + System.out.println(serviceInt); + System.out.println(serviceInt.getIn()); + System.out.println(serviceInt.getOut()); + ObjectDecoderInputStream in = (ObjectDecoderInputStream) serviceInt.getIn(); + ((ObjectEncoderOutputStream) IONetworkServiceImpl + .getService() + .getOut()) + .writeObject(new UserInfo(MessageType.AUTH, + login, + hash(password))); + Message msg; + while (true) { + if (in.available() > 0) { + msg = (Message) in.readObject(); + if (msg.getType() == MessageType.OK) + return false; + if (msg.getType() == MessageType.ERROR) { + String cause = (String) msg.getPayload(); + UserDialog.errorDialog(cause); + return true; + } + } + } + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + return true; + } +} diff --git a/client/src/main/java/org/owpk/IODataHandler/IONetworkServiceImpl.java b/client/src/main/java/org/owpk/IODataHandler/IONetworkServiceImpl.java new file mode 100644 index 0000000..dc408b2 --- /dev/null +++ b/client/src/main/java/org/owpk/IODataHandler/IONetworkServiceImpl.java @@ -0,0 +1,105 @@ +package org.owpk.IODataHandler; + +import io.netty.handler.codec.serialization.ObjectDecoderInputStream; +import io.netty.handler.codec.serialization.ObjectEncoderOutputStream; +import javafx.application.Platform; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.owpk.app.Callback; +import org.owpk.app.ClientConfig; +import org.owpk.controller.UserDialog; +import org.owpk.network.NetworkServiceInt; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +/** + * Класс {@link IONetworkServiceImpl} создающий подключение, + * по умолчанию использует параметры из конфиг файла client.properties + */ +public class IONetworkServiceImpl implements NetworkServiceInt { + private static final NetworkServiceInt service = new IONetworkServiceImpl( + ClientConfig.getConfig().getHost(), ClientConfig.getConfig().getPort()); + + private final Logger log = LogManager.getLogger(IONetworkServiceImpl.class.getName()); + private final AuthHandler authHandler; + private final String HOST; + private final int PORT; + private Socket socket; + private ObjectDecoderInputStream in; + private ObjectEncoderOutputStream out; + private boolean run; + private InputDataHandler inputDataHandler; + + public IONetworkServiceImpl(String host, int port) { + this.PORT = port; + this.HOST = host; + authHandler = new AuthHandler(); + } + + public static NetworkServiceInt getService() { + return service; + } + + @Override + public void initCallBacks(Callback... callback) throws IOException { + inputDataHandler = new InputDataHandler( + callback[0], + callback[1], + callback[2], + callback[3]); + } + + @Override + public String getName() { + return HOST; + } + + @Override + public void connect() throws Exception { + socket = new Socket(HOST, PORT); + log.info("connected : " + socket.getRemoteSocketAddress()); + out = new ObjectEncoderOutputStream(socket.getOutputStream()); + in = new ObjectDecoderInputStream(socket.getInputStream()); + run = true; + Platform.runLater(() -> { + if (authHandler.tryToAuth()) { + UserDialog.errorDialog("Need to enter login and password"); + disconnect(); + } else { + new Thread(inputDataHandler).start(); + } + }); + } + + @Override + public void disconnect() { + run = false; + log.info("disconnected : " + HOST); + try { + socket.close(); + out.close(); + out.flush(); + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public boolean isRunning() { + return run; + } + + @Override + public OutputStream getOut() { + return out; + } + + @Override + public InputStream getIn() { + return in; + } + +} diff --git a/client/src/main/java/org/owpk/network/InputDataHandler.java b/client/src/main/java/org/owpk/IODataHandler/InputDataHandler.java similarity index 74% rename from client/src/main/java/org/owpk/network/InputDataHandler.java rename to client/src/main/java/org/owpk/IODataHandler/InputDataHandler.java index 447a725..9232568 100644 --- a/client/src/main/java/org/owpk/network/InputDataHandler.java +++ b/client/src/main/java/org/owpk/IODataHandler/InputDataHandler.java @@ -1,6 +1,8 @@ package org.owpk.network; import io.netty.handler.codec.serialization.ObjectDecoderInputStream; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.owpk.app.Callback; import org.owpk.app.ClientConfig; import org.owpk.message.DataInfo; @@ -8,16 +10,16 @@ import org.owpk.util.FileInfo; import org.owpk.util.FileUtility; -import java.io.*; +import java.io.File; +import java.io.IOException; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; /** * класс обработчик входных данных */ public class InputDataHandler implements Runnable { - + private final Logger log = LogManager.getLogger(InputDataHandler.class.getName()); private final NetworkServiceInt networkServiceInt; private final Callback serverStatusLabel; private final Callback> tableViewCallback; @@ -36,10 +38,10 @@ public InputDataHandler(NetworkServiceInt networkServiceInt, Callback... callbac @Override public void run() { try { - System.out.println("-:input thread init:"); + log.info("thread started"); Message msg; ObjectDecoderInputStream in = (ObjectDecoderInputStream) networkServiceInt.getIn(); - while (true) { + while (networkServiceInt.isRunning()) { if (in.available() > 0) { msg = (Message) in.readObject(); System.out.println(msg); @@ -60,8 +62,8 @@ public void run() { } } } catch (IOException | ClassNotFoundException e) { - System.out.println("-:oops server error:"); - serverStatusLabel.call("server error " + ClientConfig.getDefaultServer()); + log.error(e); + serverStatusLabel.call("network error: " + ClientConfig.getDefaultServer()); e.printStackTrace(); } finally { try { @@ -73,7 +75,7 @@ public void run() { } private boolean sessionIsOver(String fileName) { - return Arrays.stream(files.get(fileName)).allMatch(Objects::nonNull); + return Arrays.stream(files.get(fileName)).parallel().allMatch(Objects::nonNull); } private void download(DataInfo ms) throws IOException { @@ -81,20 +83,20 @@ private void download(DataInfo ms) throws IOException { String fileName = ms.getFile(); int chunkCount = ms.getChunkCount(); DataInfo[] data = files.get(fileName); - if (data != null) { + if (sessionIsOver(fileName)) { + final File f = new File( + ClientConfig.getConfig().getDownloadDirectory().toString() + "\\" + fileName); + FileUtility.writeBufferToFile(data, f); + progressBarCallback.call(0D); + serverStatusLabel.call("done"); + refreshClientCallback.call(ClientConfig.getConfig().getDownloadDirectory().toAbsolutePath()); + files.remove(fileName); + } else { long percentage = Arrays.stream(data) .filter(Objects::nonNull) .count(); double count = (float) percentage / chunkCount; progressBarCallback.call(count); - if (sessionIsOver(fileName)) { - final File f = new File( - ClientConfig.getConfig().getDownloadDirectory().toString() + "\\" + fileName); - FileUtility.writeBufferToFile(data, f); - progressBarCallback.call(0D); - serverStatusLabel.call("done"); - refreshClientCallback.call(ClientConfig.getConfig().getDownloadDirectory().toAbsolutePath()); - } } } } diff --git a/client/src/main/java/org/owpk/app/ClientConfig.java b/client/src/main/java/org/owpk/app/ClientConfig.java index dfe528c..ad09c22 100644 --- a/client/src/main/java/org/owpk/app/ClientConfig.java +++ b/client/src/main/java/org/owpk/app/ClientConfig.java @@ -1,13 +1,12 @@ package org.owpk.app; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.owpk.util.Config; -import javax.swing.filechooser.FileSystemView; import java.io.*; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Properties; /** * читает и перезаписывает файл {@link #CONFIG_NAME}, @@ -15,6 +14,7 @@ * создает синглтон {@link ClientConfig} */ public class ClientConfig extends Config { + private final Logger log = LogManager.getLogger(ClientConfig.class.getName()); private static final String CONFIG_NAME = "client.properties"; private static final String DEFAULT_SERVER = "localhost"; private Path downloadDirectory; @@ -52,8 +52,9 @@ public void writeProperty(ConfigParameters prop, String val) { try(FileWriter fw = new FileWriter(new File(CONFIG_NAME))) { properties.setProperty(prop.getDescription(), val); properties.store(fw, prop.getDescription()); - System.out.println(properties.getProperty(prop.getDescription()) + " -- " + prop.getDescription() + " : new property"); + log.info(properties.getProperty(prop.getDescription()) + " -- " + prop.getDescription() + " : new property"); } catch (IOException e) { + log.error(e); e.printStackTrace(); } } diff --git a/client/src/main/java/org/owpk/controller/ClientPanelController.java b/client/src/main/java/org/owpk/controller/ClientPanelController.java index fe23b02..33c4c48 100644 --- a/client/src/main/java/org/owpk/controller/ClientPanelController.java +++ b/client/src/main/java/org/owpk/controller/ClientPanelController.java @@ -11,8 +11,9 @@ import javafx.scene.layout.VBox; import javafx.stage.FileChooser; import lombok.SneakyThrows; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.owpk.app.Callback; -import org.owpk.app.ClientConfig; import org.owpk.util.FileInfo; import org.owpk.util.FileUtility; @@ -27,11 +28,12 @@ import java.util.stream.Collectors; public class ClientPanelController { + private final Logger log = LogManager.getLogger(ClientPanelController.class.getName()); @FXML private TableView client_panel; @FXML private Button client_forward_btn; + @FXML private Button client_back; @FXML private TextField client_textFlow; @FXML private ComboBox disk_list; - @FXML private Button client_back; @FXML private VBox client_panel_vbox; private MainSceneController mainSceneController; @@ -55,7 +57,6 @@ public void onForwardInClientHistory() { clientBackInHistoryStack.push(clientForwardInHistoryStack.pop()); clientRefresh(p); } - showBhistory(); } /** @@ -68,7 +69,6 @@ public void onBackInClientHistory(ActionEvent actionEvent) { Path p = clientBackInHistoryStack.peek(); clientRefresh(p); } - showFhistory(); } /** @@ -76,11 +76,10 @@ public void onBackInClientHistory(ActionEvent actionEvent) { */ @FXML public void onUpBtnClicked(ActionEvent actionEvent) { - Path p = clientBackInHistoryStack.peek().getParent(); + final Path p = clientBackInHistoryStack.peek().getParent(); if (p != null) { clientRefresh(p); clientBackInHistoryStack.push(p); - showBhistory(); } } @@ -107,6 +106,7 @@ public void clientRefresh(Path p) { .collect(Collectors.toList())); client_panel.sort(); } catch (IOException e) { + log.error(e); mainSceneController.setStatusLabel("can't open"); e.printStackTrace(); } @@ -116,13 +116,6 @@ public void clientRefresh() { clientRefresh(clientBackInHistoryStack.peek()); } - private void showBhistory() { - System.out.println(clientBackInHistoryStack + " <--- back"); - } - private void showFhistory() { - System.out.println(clientForwardInHistoryStack + " <--- forward"); - } - private void initCallbacks() { textFlowCallback = s -> { Platform.runLater(()-> { client_textFlow.setText(s); @@ -149,11 +142,10 @@ private void initListeners() { if (x.getClickCount() == 2 && x.getButton() == MouseButton.PRIMARY) { FileInfo f = client_panel.getSelectionModel().getSelectedItem(); if (f.getFileType() == FileInfo.FileType.DIRECTORY) { - Path p = f.getPath(); + final Path p = f.getPath(); clientRefresh(p); client_textFlow.setText(p.toString()); clientBackInHistoryStack.push(p); - showBhistory(); } else { File file = f.getPath().toFile(); if (file.exists()) { @@ -167,19 +159,17 @@ private void initListeners() { /** * инициализирует DragAndDrop слушателей */ - private Path targetDirectory; private void initDragAndDropListeners() { final FileInfo[] tempItem = new FileInfo[1]; client_panel.setOnDragDetected(x -> { - FileInfo f = client_panel.getSelectionModel().getSelectedItem(); + final FileInfo f = client_panel.getSelectionModel().getSelectedItem(); File from; if (f != null) { from = f.getPath().toFile(); - System.out.println(f.getPath()); - Dragboard db = client_panel.startDragAndDrop(TransferMode.MOVE); - ClipboardContent content = new ClipboardContent(); + final Dragboard db = client_panel.startDragAndDrop(TransferMode.MOVE); + final ClipboardContent content = new ClipboardContent(); content.putString(from.getAbsolutePath()); db.setContent(content); x.consume(); @@ -192,10 +182,8 @@ private void initDragAndDropListeners() { //здесь отслеживается target путь, это можно сделать только через RowFactory client_panel.setRowFactory(x -> { - TableRow row = new TableRow<>(); - row.setOnDragDropped(event -> { - tempItem[0] = row.getItem(); - }); + final TableRow row = new TableRow<>(); + row.setOnDragDropped(event -> tempItem[0] = row.getItem()); return row; }); @@ -212,24 +200,19 @@ private void initDragAndDropListeners() { // иначе обновляется только одна таблица на которой фокус client_panel.setOnDragDropped(x -> { x.acceptTransferModes(TransferMode.ANY); - Dragboard db = x.getDragboard(); + final Dragboard db = x.getDragboard(); boolean success = false; if (db.hasString()) { - Path source = Paths.get(db.getString()); - Path target = tempItem[0] != null ? tempItem[0].getPath() : targetDirectory; + final Path source = Paths.get(db.getString()); + final Path target = tempItem[0] != null ? tempItem[0].getPath() : targetDirectory; if (!source.equals(target)) { - System.out.println("-Move from: " + source); - System.out.println("-Move to: " + target); try { FileUtility.move(source, target); mainSceneController.refreshAllClientPanels(); mainSceneController.setStatusLabel("done"); success = true; } catch (IOException e) { - Alert alert = new Alert(Alert.AlertType.ERROR); - alert.setTitle("Can't move file"); - alert.setContentText(e.toString()); - alert.showAndWait(); + UserDialog.errorDialog("can't move file \n" + e.getLocalizedMessage()); e.printStackTrace(); } } @@ -244,7 +227,7 @@ private void openFile(File file) { try { desktop.open(file); } catch (IOException ex) { - System.out.println(ex.getLocalizedMessage()); + log.error(ex); } } @@ -276,4 +259,5 @@ public void init() { initListeners(); client_panel.setPlaceholder(new Label("")); } + } diff --git a/client/src/main/java/org/owpk/controller/CloudPanelController.java b/client/src/main/java/org/owpk/controller/CloudPanelController.java index 71e7a55..6c3350a 100644 --- a/client/src/main/java/org/owpk/controller/CloudPanelController.java +++ b/client/src/main/java/org/owpk/controller/CloudPanelController.java @@ -5,18 +5,20 @@ import javafx.concurrent.Service; import javafx.concurrent.Task; import javafx.concurrent.WorkerStateEvent; +import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.geometry.Insets; import javafx.scene.control.*; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.input.Dragboard; import javafx.scene.input.TransferMode; +import org.owpk.IODataHandler.IONetworkServiceImpl; import org.owpk.app.Callback; import org.owpk.app.ClientConfig; import org.owpk.message.DataInfo; import org.owpk.message.MessageType; import org.owpk.message.Message; -import org.owpk.network.InputDataHandler; +import org.owpk.IODataHandler.InputDataHandler; import org.owpk.network.NetworkServiceFactory; import org.owpk.network.NetworkServiceInt; import org.owpk.util.FileInfo; @@ -45,6 +47,8 @@ public class CloudPanelController { private Callback> cloudTableCallback; private Callback statusLabelCallback; private Callback progressBarCallback; + + /** * метод вызывается при нажатии на кнопку "connect" * {@link NetworkServiceFactory} возвращает {@link NetworkServiceInt}, @@ -60,21 +64,18 @@ protected Task createTask() { protected Void call() throws InterruptedException, IOException { try { networkServiceInt = NetworkServiceFactory.getHandler(ClientConfig.getDefaultServer()); + networkServiceInt.initCallBacks(cloudTableCallback, + statusLabelCallback, + progressBarCallback, + mainSceneController.getClientPanelController().getRefreshPanelCallback()); networkServiceInt.connect(); - InputDataHandler inputDataHandler = - new InputDataHandler( - networkServiceInt, - cloudTableCallback, - statusLabelCallback, - progressBarCallback, - mainSceneController.getClientPanelController().getRefreshPanelCallback() - ); - networkServiceInt.initDataHandler(inputDataHandler); updateServerFolders(); } catch (IOException e) { disconnect(); networkServiceInt = null; throw new InterruptedException(); + } catch (Exception e) { + e.printStackTrace(); } return null; } @@ -236,6 +237,9 @@ protected void updateItem(FileInfo.FileType item, boolean empty) { server_panel.getColumns().add(server_column_action); } + public void onUpBtnClicked(ActionEvent actionEvent) { + } + public void init() { initListeners(); connect(); @@ -244,4 +248,5 @@ public void init() { statusLabelCallback = s -> mainSceneController.setStatusLabel(s); progressBarCallback = i -> Platform.runLater(() -> progress_cloud.setProgress(i)); } + } diff --git a/client/src/main/java/org/owpk/controller/MainSceneController.java b/client/src/main/java/org/owpk/controller/MainSceneController.java index 71b1a98..59316c9 100644 --- a/client/src/main/java/org/owpk/controller/MainSceneController.java +++ b/client/src/main/java/org/owpk/controller/MainSceneController.java @@ -64,6 +64,7 @@ public void initWindowControls(Stage stage) { //кнопка закрыть shut_down_btn.setOnMouseClicked(event -> { config.setStartPath(clientPanelController.getHistory().peek().toString()); + cloudPanelController.disconnect(); Platform.exit(); }); @@ -124,7 +125,6 @@ private void fillElements() { } public void checkConfig() { - System.out.println("Checking config"); File p = new File(config.getDownloadDirectory().toString()); if (!p.exists()) { p.mkdirs(); diff --git a/client/src/main/java/org/owpk/controller/UserDialog.java b/client/src/main/java/org/owpk/controller/UserDialog.java index 66d2144..e6ab88c 100644 --- a/client/src/main/java/org/owpk/controller/UserDialog.java +++ b/client/src/main/java/org/owpk/controller/UserDialog.java @@ -1,8 +1,11 @@ package org.owpk.controller; -import javafx.scene.control.Alert; -import javafx.scene.control.ButtonType; -import javafx.scene.control.TextInputDialog; +import javafx.application.Platform; +import javafx.geometry.Insets; +import javafx.scene.Node; +import javafx.scene.control.*; +import javafx.scene.layout.GridPane; +import javafx.util.Pair; import org.owpk.app.ClientConfig; import org.owpk.util.Config; @@ -40,4 +43,48 @@ public static void errorDialog(String msg) { alert.setContentText(msg); alert.showAndWait(); } + + public static Optional> loginDialog() { + Dialog> dialog = new Dialog<>(); + dialog.setTitle("Login Dialog"); + dialog.setHeaderText("Look, a Custom Login Dialog"); + + ButtonType loginButtonType = new ButtonType("Login", ButtonBar.ButtonData.OK_DONE); + dialog.getDialogPane().getButtonTypes().addAll(loginButtonType, ButtonType.CANCEL); + + GridPane grid = new GridPane(); + grid.setHgap(10); + grid.setVgap(10); + grid.setPadding(new Insets(20, 150, 10, 10)); + + TextField username = new TextField(); + username.setPromptText("Username"); + PasswordField password = new PasswordField(); + password.setPromptText("Password"); + + grid.add(new Label("Username:"), 0, 0); + grid.add(username, 1, 0); + grid.add(new Label("Password:"), 0, 1); + grid.add(password, 1, 1); + + Node loginButton = dialog.getDialogPane().lookupButton(loginButtonType); + loginButton.setDisable(true); + + username.textProperty().addListener((observable, oldValue, newValue) -> { + loginButton.setDisable(newValue.trim().isEmpty()); + }); + + dialog.getDialogPane().setContent(grid); + + Platform.runLater(username::requestFocus); + + dialog.setResultConverter(dialogButton -> { + if (dialogButton == loginButtonType) { + return new Pair<>(username.getText(), password.getText()); + } + return null; + }); + + return dialog.showAndWait(); + } } \ No newline at end of file diff --git a/client/src/main/java/org/owpk/network/IONetworkServiceImpl.java b/client/src/main/java/org/owpk/network/IONetworkServiceImpl.java deleted file mode 100644 index efde495..0000000 --- a/client/src/main/java/org/owpk/network/IONetworkServiceImpl.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.owpk.network; - -import io.netty.handler.codec.serialization.ObjectDecoderInputStream; -import io.netty.handler.codec.serialization.ObjectEncoderOutputStream; -import org.owpk.app.Callback; -import org.owpk.app.ClientConfig; -import org.owpk.message.DataInfo; -import org.owpk.message.MessageType; -import org.owpk.message.Message; -import org.owpk.util.FileInfo; - -import java.io.*; -import java.net.Socket; -import java.util.List; - -public class IONetworkServiceImpl implements NetworkServiceInt { - private final String HOST; - private final int PORT; - private Socket socket; - private ObjectDecoderInputStream in; - private ObjectEncoderOutputStream out; - - public IONetworkServiceImpl(String host, int port) { - this.PORT = port; - this.HOST = host; - } - - @Override - public void initDataHandler(Runnable r) { - Thread t = new Thread(r); - t.start(); - } - - @Override - public String getName() { - return "localhost"; - } - - @Override - public void connect() throws IOException { - socket = new Socket(HOST, PORT); - System.out.println("-:connected:"); - out = new ObjectEncoderOutputStream(socket.getOutputStream()); - in = new ObjectDecoderInputStream(socket.getInputStream()); - } - - @Override - public void disconnect() throws IOException { - if (socket != null) { - out.writeObject(new Message<>(MessageType.CLOSE, "")); - socket.close(); - out.close(); - out.flush(); - in.close(); - System.out.println("-:disconnected:"); - } - } - - @Override - public OutputStream getOut() { - return out; - } - - @Override - public InputStream getIn() { - return in; - } - -} diff --git a/client/src/main/java/org/owpk/network/NetworkServiceFactory.java b/client/src/main/java/org/owpk/network/NetworkServiceFactory.java index d932cab..6063c32 100644 --- a/client/src/main/java/org/owpk/network/NetworkServiceFactory.java +++ b/client/src/main/java/org/owpk/network/NetworkServiceFactory.java @@ -1,20 +1,18 @@ package org.owpk.network; -import org.owpk.app.ClientConfig; +import org.owpk.IODataHandler.IONetworkServiceImpl; import java.util.HashMap; import java.util.Map; /** - * Класс {@link IONetworkServiceImpl} создающий подключение, - * по умолчанию использует параметры из конфиг файла client.properties + * Фабрика классов для взаимодействия с облачными хранилищами */ public class NetworkServiceFactory { - private static final Map map; + private static final Map map; static { map = new HashMap<>(); - map.put("localhost", new IONetworkServiceImpl( - ClientConfig.getConfig().getHost(), ClientConfig.getConfig().getPort())); + map.put("localhost", IONetworkServiceImpl.getService()); } public static NetworkServiceInt getHandler(String server) { return map.get(server); diff --git a/client/src/main/java/org/owpk/network/NetworkServiceInt.java b/client/src/main/java/org/owpk/network/NetworkServiceInt.java index 13d56c6..3963aa8 100644 --- a/client/src/main/java/org/owpk/network/NetworkServiceInt.java +++ b/client/src/main/java/org/owpk/network/NetworkServiceInt.java @@ -1,16 +1,18 @@ package org.owpk.network; +import org.owpk.app.Callback; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public interface NetworkServiceInt { - void initDataHandler(Runnable r); - - String getName(); - void connect() throws IOException; + void initCallBacks(Callback... callbacks) throws IOException; + void connect() throws IOException, ClassNotFoundException, Exception; void disconnect() throws IOException; + boolean isRunning(); + String getName(); OutputStream getOut(); InputStream getIn(); diff --git a/client/src/main/resources/view/client_panel.fxml b/client/src/main/resources/view/client_panel.fxml index faeb45a..3a61f32 100644 --- a/client/src/main/resources/view/client_panel.fxml +++ b/client/src/main/resources/view/client_panel.fxml @@ -51,6 +51,15 @@ + diff --git a/client/src/main/resources/view/cloud_panel.fxml b/client/src/main/resources/view/cloud_panel.fxml index aa06c8b..66d521e 100644 --- a/client/src/main/resources/view/cloud_panel.fxml +++ b/client/src/main/resources/view/cloud_panel.fxml @@ -45,6 +45,15 @@ + - -