diff --git a/Workspace/client/client.iml b/Workspace/client/client.iml
index b561a70c..d00773ef 100644
--- a/Workspace/client/client.iml
+++ b/Workspace/client/client.iml
@@ -11,7 +11,6 @@
-
diff --git a/Workspace/client/dependency-reduced-pom.xml b/Workspace/client/dependency-reduced-pom.xml
new file mode 100644
index 00000000..bfbe2632
--- /dev/null
+++ b/Workspace/client/dependency-reduced-pom.xml
@@ -0,0 +1,39 @@
+
+
+
+ Main
+ com.pqt
+ 1.0-SNAPSHOT
+
+ 4.0.0
+ client
+
+
+
+ maven-shade-plugin
+ 3.1.0
+
+
+ package
+
+ shade
+
+
+
+
+
+ com.pqt.client.Main
+ 1.0-SNAPSHOT
+ Guillaume 'Cess' Prost
+ 26/10/2017
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Workspace/client/pom.xml b/Workspace/client/pom.xml
index 8c3e701a..8d19b526 100644
--- a/Workspace/client/pom.xml
+++ b/Workspace/client/pom.xml
@@ -17,6 +17,35 @@
1.0-SNAPSHOT
-
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.1.0
+
+
+ package
+
+ shade
+
+
+
+
+
+
+ com.pqt.client.Main
+ 1.0-SNAPSHOT
+ Guillaume 'Cess' Prost
+ 26/10/2017
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Workspace/client/src/main/java/com/pqt/client/Main.java b/Workspace/client/src/main/java/com/pqt/client/Main.java
index c7240576..311fd517 100644
--- a/Workspace/client/src/main/java/com/pqt/client/Main.java
+++ b/Workspace/client/src/main/java/com/pqt/client/Main.java
@@ -1,21 +1,21 @@
package com.pqt.client;
import com.pqt.client.gui.main_frame.MainFrame;
+import com.pqt.client.gui.main_frame.listeners.IMainFrameModelListener;
import com.pqt.client.gui.modules.account_screen.AccountScreen;
import com.pqt.client.gui.modules.sale_screen.SaleScreen;
import com.pqt.client.gui.modules.stat_screen.StatScreen;
import com.pqt.client.gui.modules.stock_screen.StockScreen;
-import com.pqt.client.gui.ressources.components.generics.others.SideBar;
-import com.pqt.client.gui.ressources.components.generics.others.listeners.ISideBarListener;
import com.pqt.client.gui.ressources.components.generics.toast.ToastFactory;
import com.pqt.client.gui.ressources.css.GUICssTool;
import com.pqt.client.gui.ressources.strings.GUIStringTool;
-import com.pqt.client.module.account.AccountService;
-import com.pqt.client.module.sale.SaleService;
-import com.pqt.client.module.stat.StatService;
-import com.pqt.client.module.stock.StockService;
+import com.pqt.client.gui.startup_frame.StartupFrame;
+import com.pqt.client.gui.startup_frame.listeners.frame.IStartupFrameModelListener;
+import com.pqt.client.module.ClientBackEndModuleManager;
import javafx.application.Application;
+import javafx.application.Platform;
import javafx.scene.Scene;
+import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Main extends Application{
@@ -26,25 +26,53 @@ public class Main extends Application{
@Override
public void start(Stage primaryStage) throws Exception {
- SaleService saleService = new SaleService();
- StockService stockService = new StockService();
- AccountService accountService = new AccountService();
- StatService statService = new StatService();
- MainFrame mainFrame = new MainFrame(accountService);
- mainFrame.addModule(new SaleScreen(accountService, stockService, saleService), true);
- mainFrame.addModule(new StockScreen(stockService, accountService));
- mainFrame.addModule(new StatScreen(statService));
- mainFrame.addModule(new AccountScreen(accountService));
+ ClientBackEndModuleManager moduleManager = new ClientBackEndModuleManager(null);
- Scene scene = new Scene(mainFrame.getPane(), 800, 600);
- scene.getStylesheets().clear();
- scene.getStylesheets().addAll(getClass().getResource(GUICssTool.getCssFilePath()).toExternalForm());
+ MainFrame mainFrame = new MainFrame(moduleManager.getAccountService());
+ mainFrame.addModule(new SaleScreen(moduleManager.getAccountService(), moduleManager.getStockService(), moduleManager.getSaleService()), true);
+ mainFrame.addModule(new StockScreen(moduleManager.getStockService(), moduleManager.getAccountService()));
+ mainFrame.addModule(new StatScreen(moduleManager.getStatService()));
+ mainFrame.addModule(new AccountScreen(moduleManager.getAccountService()));
+ Scene mainFrameScene = initScene(mainFrame.getPane());
+
+ StartupFrame startupFrame = new StartupFrame(moduleManager.getAccountService(), moduleManager.getNetworkService());
+ Scene startupFrameScene = initScene(startupFrame.getPane());
+
+ mainFrame.addFrameModelListener(getMainFrameListener(primaryStage, startupFrameScene));
+ startupFrame.addFrameModelListener(getStartupFrameListener(primaryStage, mainFrameScene));
ToastFactory.init(primaryStage);
primaryStage.setTitle(GUIStringTool.getAppTitle());
- primaryStage.setScene(scene);
+ primaryStage.setScene(startupFrameScene);
primaryStage.show();
}
+
+ private Scene initScene(Pane pane){
+ Scene scene = new Scene(pane);
+ scene.getStylesheets().clear();
+ scene.getStylesheets().addAll(getClass().getResource(GUICssTool.getCssFilePath()).toExternalForm());
+
+ return scene;
+ }
+
+ private IStartupFrameModelListener getStartupFrameListener(Stage primaryStage, Scene sceneToDisplay){
+ return () -> trySwitchScene(primaryStage, sceneToDisplay, true);
+ }
+
+ private IMainFrameModelListener getMainFrameListener(Stage primaryStage, Scene sceneToDisplay){
+ return () -> trySwitchScene(primaryStage, sceneToDisplay, false);
+ }
+
+ private void trySwitchScene(Stage primaryStage, Scene sceneToDisplay, boolean maximize){
+ if(sceneToDisplay!=null) {
+ primaryStage.hide();
+ primaryStage.setScene(sceneToDisplay);
+ primaryStage.setMaximized(maximize);
+ primaryStage.show();
+ }else{
+ Platform.exit();
+ }
+ }
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrame.java b/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrame.java
index 4ded52f6..bccfbce8 100644
--- a/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrame.java
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrame.java
@@ -1,7 +1,9 @@
package com.pqt.client.gui.main_frame;
+import com.pqt.client.gui.main_frame.listeners.IMainFrameModelListener;
import com.pqt.client.gui.modules.IGuiModule;
import com.pqt.client.gui.ressources.components.generics.IFXComponent;
+import com.pqt.client.gui.startup_frame.listeners.frame.IStartupFrameModelListener;
import com.pqt.client.module.account.AccountService;
import javafx.scene.layout.Pane;
@@ -9,9 +11,10 @@ public class MainFrame implements IFXComponent {
private MainFrameView view;
private MainFrameController ctrl;
+ private MainFrameModel model;
public MainFrame(AccountService accountService) {
- MainFrameModel model = new MainFrameModel(accountService);
+ model = new MainFrameModel(accountService);
ctrl = new MainFrameController(model);
model.addListener(ctrl);
@@ -28,6 +31,10 @@ public class MainFrame implements IFXComponent {
ctrl.addModule(module, false);
}
+ public void addFrameModelListener(IMainFrameModelListener l){
+ model.addListener(l);
+ }
+
@Override
public Pane getPane() {
return view.getPane();
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrameController.java b/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrameController.java
index 180f7802..15f43711 100644
--- a/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrameController.java
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrameController.java
@@ -2,17 +2,12 @@ package com.pqt.client.gui.main_frame;
import com.pqt.client.gui.main_frame.listeners.IMainFrameModelListener;
import com.pqt.client.gui.modules.IGuiModule;
-import com.pqt.client.gui.ressources.components.generics.validators.listeners.IValidatorComponentListener;
-import com.pqt.client.gui.ressources.components.specifics.account.listeners.IAccountComponentListener;
-import com.pqt.core.entities.user_account.Account;
import com.pqt.core.entities.user_account.AccountLevel;
-import javafx.event.Event;
class MainFrameController implements IMainFrameModelListener {
private MainFrameModel model;
private MainFrameView view;
- private IValidatorComponentListener accountManagerAccountListener;
MainFrameController(MainFrameModel model) {
this.model = model;
@@ -23,7 +18,6 @@ class MainFrameController implements IMainFrameModelListener {
}
void updateView(){
- view.feedAccountCollectionToManager(model.getAccounts());
view.setCurrentAccount(model.getCurrentAccount());
if(model.getCurrentAccount()!=null)
view.updateModuleButtonLock(model.getCurrentAccount().getPermissionLevel());
@@ -38,57 +32,12 @@ class MainFrameController implements IMainFrameModelListener {
this.view.addGuiModule(module.getModuleName(),module.getPane(), module.getLowestRequiredAccountLevel(), activate);
}
- IValidatorComponentListener getAccountManagerValidatorListener() {
- return new IValidatorComponentListener() {
- @Override
- public void onValidationEvent() {
- if(view.isAccountCreationPossible())
- model.connectAccount(view.create());
- }
-
- @Override
- public void onCancelEvent() {
- model.disconnectCurrentAccount();
- }
- };
- }
-
- IAccountComponentListener getAccountManagerAccountListener() {
- return new IAccountComponentListener() {
- @Override
- public void onRefreshContentRequestEvent() {
-
- }
-
- @Override
- public void onContentClickEvent(Event event, Account eventTarget) {
-
- }
-
- @Override
- public void onAddContentRequestEvent() {
-
- }
-
- @Override
- public void onRemoveContentRequestEvent(Account content) {
-
- }
-
- @Override
- public void onDetailContentRequestEvent(Account content) {
-
- }
- };
+ public void onAccountDisconnectionRequested() {
+ model.disconnectCurrentAccount();
}
@Override
- public void onAccountStatusChangedEvent(boolean status) {
- updateView();
- }
+ public void onAccountDisconnectedEvent() {
- @Override
- public void onAccountCollectionChangedEvent() {
- updateView();
}
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrameModel.java b/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrameModel.java
index c8cb5fc7..12a95bd7 100644
--- a/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrameModel.java
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrameModel.java
@@ -20,37 +20,30 @@ class MainFrameModel {
this.accountService.addListener(new IAccountListener() {
@Override
public void onAccountStatusChangedEvent(boolean status) {
- MainFrameModel.this.fireAccountStatusChangedEvent(status);
+ if(!status){
+ MainFrameModel.this.fireAccountDisconnectedEvent();
+ }
+ }
+
+ @Override
+ public void onAccountStatusNotChangedEvent(Throwable cause) {
+
}
@Override
public void onAccountListChangedEvent() {
- MainFrameModel.this.fireAccountCollectionChangedEvent();
}
});
}
- private void fireAccountCollectionChangedEvent() {
- Arrays.stream(listenerList.getListeners(IMainFrameModelListener.class)).forEach(IMainFrameModelListener::onAccountCollectionChangedEvent);
- }
-
- private void fireAccountStatusChangedEvent(boolean status) {
- Arrays.stream(listenerList.getListeners(IMainFrameModelListener.class)).forEach(l->l.onAccountStatusChangedEvent(status));
- }
-
- void connectAccount(Account account) {
- accountService.setCurrentAccount(account);
- accountService.logInCurrentAccount(account.getPassword());
+ private void fireAccountDisconnectedEvent() {
+ Arrays.stream(listenerList.getListeners(IMainFrameModelListener.class)).forEach(IMainFrameModelListener::onAccountDisconnectedEvent);
}
void disconnectCurrentAccount() {
accountService.logOutCurrentAccount();
}
- Collection getAccounts(){
- return accountService.getAllAccounts();
- }
-
void addListener(IMainFrameModelListener listener){
listenerList.add(IMainFrameModelListener.class, listener);
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrameView.java b/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrameView.java
index 7b951581..fbe883b1 100644
--- a/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrameView.java
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/MainFrameView.java
@@ -1,6 +1,5 @@
package com.pqt.client.gui.main_frame;
-import com.pqt.client.gui.ressources.components.AccountManager;
import com.pqt.client.gui.ressources.components.generics.IFXComponent;
import com.pqt.client.gui.ressources.components.generics.others.SideBar;
import com.pqt.client.gui.ressources.components.generics.others.listeners.ISideBarListener;
@@ -10,11 +9,9 @@ import com.pqt.core.entities.user_account.AccountLevel;
import javafx.application.Platform;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
-import javafx.beans.value.ObservableValue;
-import javafx.geometry.Orientation;
import javafx.scene.Node;
import javafx.scene.control.Button;
-import javafx.scene.control.ToolBar;
+import javafx.scene.control.Label;
import javafx.scene.input.KeyCode;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.BorderPane;
@@ -22,16 +19,14 @@ import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
-import java.util.Collection;
-
class MainFrameView implements IFXComponent{
private final MainFrameController ctrl;
private BorderPane mainPane;
- private AccountManager accountManager;
private VBox buttonHolder;
private ObjectProperty currentAccountLevel;
+ private Label accountNameLabel;
MainFrameView(MainFrameController ctrl) {
this.ctrl = ctrl;
@@ -51,11 +46,10 @@ class MainFrameView implements IFXComponent{
buttonHolder.prefWidthProperty().bind(sidebar.widthProperty());
sidebar.getChildren().add(buttonHolder);
- accountManager = new AccountManager();
- accountManager.addListener(ctrl.getAccountManagerValidatorListener());
- accountManager.addListener(ctrl.getAccountManagerAccountListener());
- accountManager.getPane().prefWidthProperty().bind(sidebar.widthProperty());
- sidebar.getChildren().add(accountManager.getPane());
+ accountNameLabel = new Label();
+ Button disconnectionButton = new Button(GUIStringTool.getLogoutButtonLabel());
+ disconnectionButton.setOnAction((event -> ctrl.onAccountDisconnectionRequested()));
+ sidebar.getChildren().addAll(accountNameLabel, disconnectionButton);
mainPane.setLeft(sidebar);
@@ -120,20 +114,8 @@ class MainFrameView implements IFXComponent{
buttonHolder.getChildren().add(button);
}
- boolean isAccountCreationPossible(){
- return accountManager.isCreationPossible();
- }
-
- Account create(){
- return accountManager.create();
- }
-
void setCurrentAccount(Account account){
- accountManager.setCurrentAccount(account);
- }
-
- void feedAccountCollectionToManager(Collection accounts){
- accountManager.display(accounts);
+ accountNameLabel.setText(GUIStringTool.getAccountStringConverter().toString(account));
}
void updateModuleButtonLock(AccountLevel level) {
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/listeners/IMainFrameModelListener.java b/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/listeners/IMainFrameModelListener.java
index 5c876e26..d9c1229f 100644
--- a/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/listeners/IMainFrameModelListener.java
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/main_frame/listeners/IMainFrameModelListener.java
@@ -3,6 +3,5 @@ package com.pqt.client.gui.main_frame.listeners;
import java.util.EventListener;
public interface IMainFrameModelListener extends EventListener{
- void onAccountStatusChangedEvent(boolean status);
- void onAccountCollectionChangedEvent();
+ void onAccountDisconnectedEvent();
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/modules/account_screen/AccountScreenModel.java b/Workspace/client/src/main/java/com/pqt/client/gui/modules/account_screen/AccountScreenModel.java
index a1a129a0..471b7506 100644
--- a/Workspace/client/src/main/java/com/pqt/client/gui/modules/account_screen/AccountScreenModel.java
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/modules/account_screen/AccountScreenModel.java
@@ -37,8 +37,6 @@ class AccountScreenModel {
}
Collection getLevels() {
- //TODO régler ça aussi
- //return accountService.getAvailableLevels();
return EnumSet.allOf(AccountLevel.class);
}
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/modules/account_screen/account_manager_screen/AccountManagerScreen.java b/Workspace/client/src/main/java/com/pqt/client/gui/modules/account_screen/account_manager_screen/AccountManagerScreen.java
index 26cd33e2..ae980085 100644
--- a/Workspace/client/src/main/java/com/pqt/client/gui/modules/account_screen/account_manager_screen/AccountManagerScreen.java
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/modules/account_screen/account_manager_screen/AccountManagerScreen.java
@@ -9,7 +9,6 @@ import javafx.scene.layout.Pane;
import java.util.Collection;
-//TODO à faire
public class AccountManagerScreen implements IFXValidatorComponent, IFXCreatorComponent{
private AccountManagerScreenModel model;
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/modules/sale_screen/SaleScreenController.java b/Workspace/client/src/main/java/com/pqt/client/gui/modules/sale_screen/SaleScreenController.java
index 6640d324..6bdfb43f 100644
--- a/Workspace/client/src/main/java/com/pqt/client/gui/modules/sale_screen/SaleScreenController.java
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/modules/sale_screen/SaleScreenController.java
@@ -13,7 +13,9 @@ import com.pqt.core.entities.user_account.Account;
import com.pqt.core.entities.user_account.AccountLevel;
import javafx.event.Event;
+import java.util.ArrayList;
import java.util.List;
+import java.util.stream.Collectors;
class SaleScreenController {
@@ -45,7 +47,7 @@ class SaleScreenController {
@Override
public void onAccountListUpdatedEvent() {
- view.setAccounts(model.getAccountList());
+ view.setAccounts(new ArrayList<>(model.getAccountList()));
}
@@ -99,7 +101,7 @@ class SaleScreenController {
return model.getProductList();
}
private List fetchAccountList(){
- return model.getAccountList();
+ return new ArrayList<>(model.getAccountList());
}
private List fetchSaleTypeList(){
return model.getSaleTypeList();
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/modules/sale_screen/SaleScreenModel.java b/Workspace/client/src/main/java/com/pqt/client/gui/modules/sale_screen/SaleScreenModel.java
index 4cfc6d54..2aeed7e0 100644
--- a/Workspace/client/src/main/java/com/pqt/client/gui/modules/sale_screen/SaleScreenModel.java
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/modules/sale_screen/SaleScreenModel.java
@@ -17,6 +17,7 @@ import com.pqt.core.entities.user_account.AccountLevel;
import javax.swing.event.EventListenerList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
@@ -104,6 +105,11 @@ class SaleScreenModel {
fireAccountConnectedStatusUpdateEvent();
}
+ @Override
+ public void onAccountStatusNotChangedEvent(Throwable cause) {
+
+ }
+
@Override
public void onAccountListChangedEvent() {
fireAccountListUpdatedEvent();
@@ -138,7 +144,7 @@ class SaleScreenModel {
.forEach(ISaleScreenModelListener::onAccountConnectedStateUpdatedEvent);
}
- List getAccountList() {
+ Collection getAccountList() {
return accountService.getAllAccounts();
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/StockScreenModel.java b/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/StockScreenModel.java
index 365c0648..225fcb4f 100644
--- a/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/StockScreenModel.java
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/modules/stock_screen/StockScreenModel.java
@@ -34,6 +34,11 @@ class StockScreenModel {
StockScreenModel.this.fireConnectedStatusChanged();
}
+ @Override
+ public void onAccountStatusNotChangedEvent(Throwable cause) {
+
+ }
+
@Override
public void onAccountListChangedEvent() {
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/ressources/components/AccountManager.java b/Workspace/client/src/main/java/com/pqt/client/gui/ressources/components/AccountManager.java
deleted file mode 100644
index a88fb26c..00000000
--- a/Workspace/client/src/main/java/com/pqt/client/gui/ressources/components/AccountManager.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package com.pqt.client.gui.ressources.components;
-
-import com.pqt.client.gui.ressources.components.generics.creators.IFXCreatorComponent;
-import com.pqt.client.gui.ressources.components.generics.validators.IFXValidatorComponent;
-import com.pqt.client.gui.ressources.components.specifics.account.listeners.IAccountComponentListener;
-import com.pqt.client.gui.ressources.components.generics.validators.listeners.IValidatorComponentListener;
-import com.pqt.client.gui.ressources.components.generics.validators.listeners.SimpleValidatorComponentFirerer;
-import com.pqt.client.gui.ressources.components.specifics.account.IFXAccountsDisplayerComponent;
-import com.pqt.client.gui.ressources.components.specifics.account.listeners.SimpleAccountComponentFirerer;
-import com.pqt.client.gui.ressources.strings.GUIStringTool;
-import com.pqt.core.entities.user_account.Account;
-import com.pqt.core.entities.user_account.AccountLevel;
-import javafx.application.Platform;
-import javafx.collections.FXCollections;
-import javafx.scene.control.Button;
-import javafx.scene.control.ChoiceBox;
-import javafx.scene.control.PasswordField;
-import javafx.scene.control.TextField;
-import javafx.scene.input.KeyCode;
-import javafx.scene.layout.HBox;
-import javafx.scene.layout.Pane;
-import javafx.scene.layout.VBox;
-
-import java.util.Collection;
-
-public class AccountManager implements IFXAccountsDisplayerComponent, IFXValidatorComponent, IFXCreatorComponent {
-
- private Pane mainPane;
-
- private VBox mainDisconnectedPane, mainConnectedPane;
- private TextField connectedUsernameField;
- private ChoiceBox disconnectedUsernameField;
- private PasswordField passwordField;
-
- private SimpleAccountComponentFirerer accountEventFirerer;
- private SimpleValidatorComponentFirerer validatorEventFirerer;
-
- private Account currentAccount;
-
- public AccountManager() {
- accountEventFirerer = new SimpleAccountComponentFirerer();
- validatorEventFirerer = new SimpleValidatorComponentFirerer();
-
- currentAccount = null;
-
- init();
- }
-
- private void init() {
- mainPane = new Pane();
-
- mainConnectedPane = new VBox();
- mainDisconnectedPane = new VBox();
-
- connectedUsernameField = new TextField();
- connectedUsernameField.setEditable(false);
-
- Button disconnectButton = new Button(GUIStringTool.getLogoutButtonLabel());
- disconnectButton.setOnMouseClicked(event->validatorEventFirerer.fireCancelEvent());
- disconnectButton.setOnKeyTyped(event->{if(event.getCode().equals(KeyCode.ENTER)) validatorEventFirerer.fireCancelEvent();});
-
- mainConnectedPane.getChildren().addAll(connectedUsernameField, disconnectButton);
-
-
- disconnectedUsernameField = new ChoiceBox<>();
- disconnectedUsernameField.setConverter(GUIStringTool.getAccountStringConverter());
-
- passwordField = new PasswordField();
- passwordField.setPromptText(GUIStringTool.getPasswordFieldPromptText());
-
- Button validationButton = new Button(GUIStringTool.getLoginButtonLabel());
- validationButton.setOnMouseClicked(event-> validatorEventFirerer.fireValidationEvent());
- validationButton.setOnKeyTyped(event->{if(event.getCode().equals(KeyCode.ENTER)) validatorEventFirerer.fireValidationEvent();});
-
- mainDisconnectedPane.getChildren().addAll(disconnectedUsernameField, passwordField, validationButton);
-
- refreshMainPane();
- display(null);
- }
-
- @Override
- public void display(Collection content) {
- Platform.runLater(()->{
- if(content!=null && content.size()>0)
- disconnectedUsernameField.setItems(FXCollections.observableArrayList(content));
- else{
- disconnectedUsernameField.getItems().clear();
- disconnectedUsernameField.getItems().add(new Account("null", "", AccountLevel.getLowest()));
- }
- });
- }
-
- public void setCurrentAccount(Account account){
- currentAccount = account;
- Platform.runLater(()->connectedUsernameField.setText(GUIStringTool.getAccountStringConverter().toString(currentAccount)));
- refreshMainPane();
- }
-
- private void refreshMainPane() {
- if(currentAccount!=null)
- Platform.runLater(
- ()->{
- mainPane.getChildren().clear();
- mainPane.getChildren().add(mainConnectedPane);
- }
- );
- else
- Platform.runLater(
- ()->{
- mainPane.getChildren().clear();
- mainPane.getChildren().add(mainDisconnectedPane);
- }
- );
- }
-
- public Account getCurrentAccount() {
- return currentAccount;
- }
-
- @Override
- public void addListener(IAccountComponentListener l) {
- accountEventFirerer.addListener(l);
- }
-
- @Override
- public void removeListener(IAccountComponentListener l) {
- accountEventFirerer.removeListener(l);
- }
-
- @Override
- public Pane getPane() {
- return mainPane;
- }
-
- @Override
- public void addListener(IValidatorComponentListener l) {
- validatorEventFirerer.addListener(l);
- }
-
- @Override
- public void removeListener(IValidatorComponentListener l) {
- validatorEventFirerer.removeListener(l);
- }
-
- @Override
- public Account create() {
- if(!isCreationPossible())
- return null;
-
- return new Account(disconnectedUsernameField.getValue().getUsername(), passwordField.getText(), disconnectedUsernameField.getValue().getPermissionLevel());
- }
-
- @Override
- public boolean isCreationPossible() {
- return currentAccount==null
- && disconnectedUsernameField.getAccessibleText()!=null
- && !disconnectedUsernameField.getAccessibleText().isEmpty()
- && passwordField.getText()!=null
- && !passwordField.getText().isEmpty();
-
- }
-}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/ressources/components/specifics/account/IFXAccountsDisplayerComponent.java b/Workspace/client/src/main/java/com/pqt/client/gui/ressources/components/specifics/account/IFXAccountsDisplayerComponent.java
deleted file mode 100644
index 1c459115..00000000
--- a/Workspace/client/src/main/java/com/pqt/client/gui/ressources/components/specifics/account/IFXAccountsDisplayerComponent.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.pqt.client.gui.ressources.components.specifics.account;
-
-import com.pqt.client.gui.ressources.components.generics.displayers.IFXDisplayerComponent;
-import com.pqt.client.gui.ressources.components.specifics.account.listeners.IAccountComponentListener;
-import com.pqt.core.entities.user_account.Account;
-
-import java.util.Collection;
-
-public interface IFXAccountsDisplayerComponent extends IFXDisplayerComponent, IAccountComponentListener> {
-
-}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/ressources/components/specifics/account/listeners/IAccountComponentListener.java b/Workspace/client/src/main/java/com/pqt/client/gui/ressources/components/specifics/account/listeners/IAccountComponentListener.java
deleted file mode 100644
index 9fe3ff70..00000000
--- a/Workspace/client/src/main/java/com/pqt/client/gui/ressources/components/specifics/account/listeners/IAccountComponentListener.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.pqt.client.gui.ressources.components.specifics.account.listeners;
-
-import com.pqt.client.gui.ressources.components.generics.displayers.listeners.IDisplayerComponentListener;
-import com.pqt.core.entities.user_account.Account;
-
-public interface IAccountComponentListener extends IDisplayerComponentListener{
-}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/ressources/components/specifics/account/listeners/SimpleAccountComponentFirerer.java b/Workspace/client/src/main/java/com/pqt/client/gui/ressources/components/specifics/account/listeners/SimpleAccountComponentFirerer.java
deleted file mode 100644
index 8f06f6a2..00000000
--- a/Workspace/client/src/main/java/com/pqt/client/gui/ressources/components/specifics/account/listeners/SimpleAccountComponentFirerer.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.pqt.client.gui.ressources.components.specifics.account.listeners;
-
-import com.pqt.client.gui.ressources.components.generics.displayers.listeners.SimpleDisplayerComponentFirerer;
-import com.pqt.core.entities.user_account.Account;
-
-public class SimpleAccountComponentFirerer extends SimpleDisplayerComponentFirerer {
- public SimpleAccountComponentFirerer() {
- super(IAccountComponentListener.class);
- }
-}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/ressources/strings/GUIStringTool.java b/Workspace/client/src/main/java/com/pqt/client/gui/ressources/strings/GUIStringTool.java
index af5f1781..25945093 100644
--- a/Workspace/client/src/main/java/com/pqt/client/gui/ressources/strings/GUIStringTool.java
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/ressources/strings/GUIStringTool.java
@@ -331,6 +331,35 @@ public class GUIStringTool {
public static String getAccountLevelColumnHeaderLabel() {
return "Niveau d'accréditation";
}
+
+ public static String getServerSectionTitleLabel() {
+ return "Serveur";
+ }
+
+ public static String getAccountSectionTitleLabel() {
+ return "Compte";
+ }
+
+ public static String getErrorConsoleSectionTitleLabel() {
+ return "Informations";
+ }
+
+ public static String getServerHostLabel() {
+ return "Host : ";
+ }
+
+ public static String getServerPortLabel() {
+ return "Port : ";
+ }
+
+ public static IObjectStringRenderer getExceptionFormatter() {
+ return e->{
+ if(e.getMessage()==null || e.getMessage().isEmpty())
+ return String.format("%s", e.getClass().getName());
+ else
+ return String.format("%s : %s", e.getClass().getName(), e.getMessage());
+ };
+ }
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrame.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrame.java
new file mode 100644
index 00000000..29e2c7e0
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrame.java
@@ -0,0 +1,32 @@
+package com.pqt.client.gui.startup_frame;
+
+import com.pqt.client.gui.ressources.components.generics.IFXComponent;
+import com.pqt.client.gui.startup_frame.listeners.frame.IStartupFrameModelListener;
+import com.pqt.client.module.account.AccountService;
+import com.pqt.client.module.network.NetworkService;
+import javafx.scene.layout.Pane;
+
+public class StartupFrame implements IFXComponent{
+
+ private StartupFrameView view;
+ private StartupFrameModel model;
+
+ public StartupFrame(AccountService accountService, NetworkService networkService) {
+ model = new StartupFrameModel(accountService, networkService);
+ StartupFrameController ctrl = new StartupFrameController(model);
+ model.addListener(ctrl);
+
+ view = new StartupFrameView(ctrl);
+ ctrl.setView(view);
+ ctrl.updateView();
+ }
+
+ public void addFrameModelListener(IStartupFrameModelListener l){
+ model.addListener(l);
+ }
+
+ @Override
+ public Pane getPane() {
+ return view.getPane();
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameController.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameController.java
new file mode 100644
index 00000000..f9bb07d1
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameController.java
@@ -0,0 +1,48 @@
+package com.pqt.client.gui.startup_frame;
+
+import com.pqt.client.gui.ressources.strings.GUIStringTool;
+import com.pqt.client.gui.startup_frame.listeners.frame.IStartupFrameModelListener;
+
+public class StartupFrameController implements IStartupFrameModelListener {
+
+ private final StartupFrameModel model;
+ private StartupFrameView view;
+
+ public StartupFrameController(StartupFrameModel model) {
+ this.model = model;
+ }
+
+ public void setView(StartupFrameView view) {
+ this.view = view;
+ }
+
+ public void updateView() {
+ view.setValidationButtonEnable(enableValidationButton());
+ }
+
+ private boolean enableValidationButton() {
+ return !view.getAccountUsernameTextFieldContent().isEmpty()
+ && !view.getServerPortTextFieldContent().isEmpty()
+ && !view.getServerPortTextFieldContent().isEmpty();
+ }
+
+ public void onValidation() {
+ if(!model.isStartupProcessRunning()){
+ try {
+ model.beginStartupProcess(
+ view.getServerHostTextFieldContent(),
+ view.getServerPortTextFieldContent(),
+ view.getAccountUsernameTextFieldContent(),
+ view.getAccountPasswordTextFieldContent()
+ );
+ }catch(NullPointerException | IllegalArgumentException e){
+ view.displayError(GUIStringTool.getExceptionFormatter().render(e));
+ }
+ }
+ }
+
+ @Override
+ public void onStartupValidated() {
+ view.clearPasswordField();
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameModel.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameModel.java
new file mode 100644
index 00000000..b02374db
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameModel.java
@@ -0,0 +1,77 @@
+package com.pqt.client.gui.startup_frame;
+
+import com.pqt.client.gui.startup_frame.listeners.frame.IStartupFrameModelEventFirerer;
+import com.pqt.client.gui.startup_frame.listeners.frame.IStartupFrameModelListener;
+import com.pqt.client.gui.startup_frame.listeners.frame.SimpleStartupFrameModelEventFirerer;
+import com.pqt.client.gui.startup_frame.listeners.procedure.IStartupProcedureListener;
+import com.pqt.client.module.account.AccountService;
+import com.pqt.client.module.network.NetworkService;
+
+public class StartupFrameModel {
+
+ private final AccountService accountService;
+ private final NetworkService networkService;
+ private final IStartupFrameModelEventFirerer firerer;
+
+ private boolean startupProcessBegan;
+
+ public StartupFrameModel(AccountService accountService, NetworkService networkService) {
+ this.accountService = accountService;
+ this.networkService = networkService;
+ firerer = new SimpleStartupFrameModelEventFirerer();
+ startupProcessBegan = false;
+ }
+
+ public void addListener(IStartupFrameModelListener ctrl) {
+ firerer.addListener(ctrl);
+ }
+
+ public boolean isStartupProcessRunning() {
+ return startupProcessBegan;
+ }
+
+ public void beginStartupProcess(String requiredHost, String requiredPort, String username, String password) {
+ if(!startupProcessBegan){
+ checkParameters(requiredHost, requiredPort, username, password);
+ startupProcessBegan = true;
+
+ Integer requiredIntPort = Integer.parseInt(requiredPort);
+
+ new StartupProcedureHandler(networkService, accountService)
+ .init(requiredHost, requiredIntPort, username, password)
+ .addListener(new IStartupProcedureListener() {
+ @Override
+ public void onServerFoundEvent(String URL, Integer Port) {
+
+ }
+
+ @Override
+ public void onUserAccountUnknownEvent(String username) {
+
+ }
+
+ @Override
+ public void onUserAccountConnectedEvent(String username) {
+ firerer.fireStartupValidated();
+ }
+
+ @Override
+ public void onUserAccountDisconnectedEvent(String username) {
+
+ }
+ })
+ .handle();
+ }
+ }
+
+ private void checkParameters(String host, String port, String username, String password) {
+ if(host==null || port == null || username == null || password == null)
+ throw new NullPointerException("Null parameters are not allowed on startup");
+
+ if(username.isEmpty() || host.isEmpty() || port.isEmpty())
+ throw new IllegalArgumentException("The following parameters must be filled : host, port, username");
+
+ if(!port.matches("^\\d+$"))
+ throw new IllegalArgumentException("Given port is not a positive integer");
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameView.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameView.java
new file mode 100644
index 00000000..f617423c
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupFrameView.java
@@ -0,0 +1,115 @@
+package com.pqt.client.gui.startup_frame;
+
+import com.pqt.client.gui.ressources.components.generics.IFXComponent;
+import com.pqt.client.gui.ressources.strings.GUIStringTool;
+import javafx.scene.control.*;
+import javafx.scene.layout.*;
+import javafx.scene.text.Text;
+
+public class StartupFrameView implements IFXComponent{
+
+ private VBox mainPane;
+ private final StartupFrameController ctrl;
+
+ private TextField serverHostTextField;
+ private TextField serverPortTextField;
+ private TextField usernameTextField;
+ private TextField passwordTextField;
+
+ private Button validationButton;
+ private Text infoText;
+
+ public StartupFrameView(StartupFrameController ctrl) {
+ this.ctrl = ctrl;
+ initGui();
+ }
+
+ private void initGui() {
+ try {
+ mainPane = new VBox();
+
+ Label serverHostLabel = new Label(GUIStringTool.getServerHostLabel());
+ serverHostTextField = makeTextField(TextField.class);
+ Label serverPortLabel = new Label(GUIStringTool.getServerPortLabel());
+ serverPortTextField = makeTextField(TextField.class);
+
+ GridPane serverFieldGridPane = new GridPane();
+ serverFieldGridPane.add(serverHostLabel, 0, 0);
+ serverFieldGridPane.add(serverHostTextField, 1, 0);
+ serverFieldGridPane.add(serverPortLabel, 0, 1);
+ serverFieldGridPane.add(serverPortTextField, 1, 1);
+
+ TitledPane serverTitledPane = new TitledPane(GUIStringTool.getServerSectionTitleLabel(), serverFieldGridPane);
+
+
+ Label usernameLabel = new Label(GUIStringTool.getUsernameLabel());
+ usernameTextField = makeTextField(TextField.class);
+ Label passwordLabel = new Label(GUIStringTool.getPasswordLabel());
+ passwordTextField = makeTextField(PasswordField.class);
+
+ GridPane accountFieldGridPane = new GridPane();
+ accountFieldGridPane.add(usernameLabel, 0, 0);
+ accountFieldGridPane.add(usernameTextField, 1, 0);
+ accountFieldGridPane.add(passwordLabel, 0, 1);
+ accountFieldGridPane.add(passwordTextField, 1, 1);
+
+ TitledPane accountTitledPane = new TitledPane(GUIStringTool.getAccountSectionTitleLabel(), accountFieldGridPane);
+
+ validationButton = new Button(GUIStringTool.getValidationButtonLabel());
+ validationButton.setOnAction((event) -> {
+ ctrl.onValidation();
+ });
+
+ infoText = new Text("");
+ infoText.getStyleClass().add("text-displayer");
+ TitledPane errorConsoleTitledPane = new TitledPane(GUIStringTool.getErrorConsoleSectionTitleLabel(), infoText);
+ infoText.textProperty().addListener((obs, oldValue, newValue)->errorConsoleTitledPane.setExpanded(true));
+
+ mainPane.getChildren().addAll(serverTitledPane, accountTitledPane, errorConsoleTitledPane, validationButton);
+ }catch(Exception e){
+ //TODO Shutdown software on exception
+ e.printStackTrace();
+ }
+ }
+
+ private T makeTextField(Class clazz) throws IllegalAccessException, InstantiationException {
+ T ntf = clazz.newInstance();
+ ntf.textProperty().addListener((obs, oldVal, newVal)->{
+ ctrl.updateView();
+ });
+ return ntf;
+ }
+
+ String getServerHostTextFieldContent(){
+ return serverHostTextField.getText();
+ }
+
+ String getServerPortTextFieldContent(){
+ return serverPortTextField.getText();
+ }
+
+ String getAccountUsernameTextFieldContent(){
+ return usernameTextField.getText();
+ }
+
+ String getAccountPasswordTextFieldContent(){
+ return passwordTextField.getText();
+ }
+
+ @Override
+ public Pane getPane() {
+ return mainPane;
+ }
+
+ public void setValidationButtonEnable(boolean enable) {
+ this.validationButton.setDisable(!enable);
+ }
+
+ public void clearPasswordField() {
+ passwordTextField.setText("");
+ }
+
+ public void displayError(String errorMsg) {
+ infoText.setText(errorMsg);
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupProcedureHandler.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupProcedureHandler.java
new file mode 100644
index 00000000..b79c9f22
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/StartupProcedureHandler.java
@@ -0,0 +1,124 @@
+package com.pqt.client.gui.startup_frame;
+
+import com.pqt.client.gui.startup_frame.listeners.procedure.IStartupProcedureEventFirerer;
+import com.pqt.client.gui.startup_frame.listeners.procedure.IStartupProcedureListener;
+import com.pqt.client.module.account.AccountService;
+import com.pqt.client.module.account.listeners.AccountListenerAdapter;
+import com.pqt.client.module.account.listeners.IAccountListener;
+import com.pqt.client.module.network.NetworkService;
+import com.pqt.client.module.network.listeners.INetworkServiceListener;
+import com.pqt.core.entities.user_account.Account;
+
+class StartupProcedureHandler {
+
+ private NetworkService networkService;
+ private AccountService accountService;
+
+ private String host, username, password;
+ private Integer port;
+
+ private IStartupProcedureEventFirerer firerer;
+
+ StartupProcedureHandler(NetworkService networkService, AccountService accountService) {
+ this.networkService = networkService;
+ this.accountService = accountService;
+ }
+
+ StartupProcedureHandler init(String host, Integer port, String username, String password){
+ this.host = host;
+ this.port = port;
+ this.username = username;
+ this.password = password;
+
+ return this;
+ }
+
+ void handle(){
+ testConnection();
+ }
+
+ private void testConnection(){
+ networkService.addListener(getPingListener());
+ networkService.sendPQTPing(host, port);
+ }
+
+ private void useRequestedServer(){
+ //Server found
+ firerer.fireServerFoundEvent(host, port);
+ networkService.setActiveServer(host, port);
+ accountService.addListener(getUpdateAccountListListener());
+ accountService.refreshAccounts();
+ }
+
+ private void connectAccount(){
+ Account match = accountService.getAllAccounts().stream()
+ .filter(account -> account.getUsername().equals(username))
+ .findFirst()
+ .orElse(null);
+
+ if(match==null){
+ //Compte spécifié inconnu
+ firerer.fireUserAccountUnknownEvent(username);
+ }else{
+ accountService.setCurrentAccount(match);
+ accountService.addListener(getConnectAccountListener());
+ accountService.logInCurrentAccount(StartupProcedureHandler.this.password);
+ }
+ }
+
+ private INetworkServiceListener getPingListener(){
+ return new INetworkServiceListener() {
+ @Override
+ public void onPQTPingSuccessEvent(String host, Integer port) {
+ if(StartupProcedureHandler.this.host.equals(host)
+ && StartupProcedureHandler.this.port.equals(port)){
+ useRequestedServer();
+ }
+ }
+
+ @Override
+ public void onPQTPingFailureEvent(String host, Integer port, Throwable cause) {
+
+ }
+
+ @Override
+ public void onNewServerConfigData() {
+
+ }
+ };
+ }
+
+ private IAccountListener getUpdateAccountListListener(){
+ return new AccountListenerAdapter(){
+ @Override
+ public void onAccountListChangedEvent(){
+ connectAccount();
+ }
+ };
+ }
+
+ private IAccountListener getConnectAccountListener(){
+ return new AccountListenerAdapter(){
+ @Override
+ public void onAccountStatusChangedEvent(boolean status) {
+ if(status){
+ //Compte connecté
+ firerer.fireUserAccountConnectedEvent(username);
+ }else{
+ //Compte non-connecté
+ firerer.fireUserAccountDisconnectedEvent(username);
+ }
+ }
+ };
+ }
+
+ public StartupProcedureHandler addListener(IStartupProcedureListener l){
+ firerer.addListener(l);
+ return this;
+ }
+
+ public StartupProcedureHandler removeListener(IStartupProcedureListener l){
+ firerer.removeListener(l);
+ return this;
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/frame/IStartupFrameModelEventFirerer.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/frame/IStartupFrameModelEventFirerer.java
new file mode 100644
index 00000000..877df58f
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/frame/IStartupFrameModelEventFirerer.java
@@ -0,0 +1,8 @@
+package com.pqt.client.gui.startup_frame.listeners.frame;
+
+public interface IStartupFrameModelEventFirerer {
+ void fireStartupValidated();
+
+ void addListener(IStartupFrameModelListener l);
+ void removeListener(IStartupFrameModelListener l);
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/frame/IStartupFrameModelListener.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/frame/IStartupFrameModelListener.java
new file mode 100644
index 00000000..5249ede1
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/frame/IStartupFrameModelListener.java
@@ -0,0 +1,7 @@
+package com.pqt.client.gui.startup_frame.listeners.frame;
+
+import java.util.EventListener;
+
+public interface IStartupFrameModelListener extends EventListener {
+ void onStartupValidated();
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/frame/SimpleStartupFrameModelEventFirerer.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/frame/SimpleStartupFrameModelEventFirerer.java
new file mode 100644
index 00000000..1ada34ae
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/frame/SimpleStartupFrameModelEventFirerer.java
@@ -0,0 +1,29 @@
+package com.pqt.client.gui.startup_frame.listeners.frame;
+
+import javax.swing.event.EventListenerList;
+import java.util.Arrays;
+
+public class SimpleStartupFrameModelEventFirerer implements IStartupFrameModelEventFirerer {
+
+ private final EventListenerList listenerList;
+
+ public SimpleStartupFrameModelEventFirerer() {
+ this.listenerList = new EventListenerList();
+ }
+
+ @Override
+ public void fireStartupValidated() {
+ Arrays.stream(listenerList.getListeners(IStartupFrameModelListener.class))
+ .forEach(IStartupFrameModelListener::onStartupValidated);
+ }
+
+ @Override
+ public void addListener(IStartupFrameModelListener l) {
+ listenerList.add(IStartupFrameModelListener.class, l);
+ }
+
+ @Override
+ public void removeListener(IStartupFrameModelListener l) {
+ listenerList.remove(IStartupFrameModelListener.class, l);
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/procedure/IStartupProcedureEventFirerer.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/procedure/IStartupProcedureEventFirerer.java
new file mode 100644
index 00000000..e06829c7
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/procedure/IStartupProcedureEventFirerer.java
@@ -0,0 +1,12 @@
+package com.pqt.client.gui.startup_frame.listeners.procedure;
+
+public interface IStartupProcedureEventFirerer {
+
+ void fireServerFoundEvent(String URL, Integer Port);
+ void fireUserAccountUnknownEvent(String username);
+ void fireUserAccountConnectedEvent(String username);
+ void fireUserAccountDisconnectedEvent(String username);
+
+ void addListener(IStartupProcedureListener l );
+ void removeListener(IStartupProcedureListener l );
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/procedure/IStartupProcedureListener.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/procedure/IStartupProcedureListener.java
new file mode 100644
index 00000000..cdf6f189
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/procedure/IStartupProcedureListener.java
@@ -0,0 +1,11 @@
+package com.pqt.client.gui.startup_frame.listeners.procedure;
+
+import java.util.EventListener;
+
+public interface IStartupProcedureListener extends EventListener{
+
+ void onServerFoundEvent(String URL, Integer Port);
+ void onUserAccountUnknownEvent(String username);
+ void onUserAccountConnectedEvent(String username);
+ void onUserAccountDisconnectedEvent(String username);
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/procedure/SimpleStartupProcedureEventFirerer.java b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/procedure/SimpleStartupProcedureEventFirerer.java
new file mode 100644
index 00000000..f0cef5cb
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/gui/startup_frame/listeners/procedure/SimpleStartupProcedureEventFirerer.java
@@ -0,0 +1,47 @@
+package com.pqt.client.gui.startup_frame.listeners.procedure;
+
+import javax.swing.event.EventListenerList;
+import java.util.Arrays;
+
+public class SimpleStartupProcedureEventFirerer implements IStartupProcedureEventFirerer {
+
+ private final EventListenerList listenerList;
+
+ public SimpleStartupProcedureEventFirerer() {
+ this.listenerList = new EventListenerList();
+ }
+
+ @Override
+ public void fireServerFoundEvent(String URL, Integer port) {
+ Arrays.stream(listenerList.getListeners(IStartupProcedureListener.class))
+ .forEach(l->l.onServerFoundEvent(URL, port));
+ }
+
+ @Override
+ public void fireUserAccountUnknownEvent(String username) {
+ Arrays.stream(listenerList.getListeners(IStartupProcedureListener.class))
+ .forEach(l->l.onUserAccountUnknownEvent(username));
+ }
+
+ @Override
+ public void fireUserAccountConnectedEvent(String username) {
+ Arrays.stream(listenerList.getListeners(IStartupProcedureListener.class))
+ .forEach(l->l.onUserAccountConnectedEvent(username));
+ }
+
+ @Override
+ public void fireUserAccountDisconnectedEvent(String username) {
+ Arrays.stream(listenerList.getListeners(IStartupProcedureListener.class))
+ .forEach(l->l.onUserAccountDisconnectedEvent(username));
+ }
+
+ @Override
+ public void addListener(IStartupProcedureListener l) {
+ listenerList.add(IStartupProcedureListener.class, l);
+ }
+
+ @Override
+ public void removeListener(IStartupProcedureListener l) {
+ listenerList.remove(IStartupProcedureListener.class, l);
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/ClientBackEndModuleManager.java b/Workspace/client/src/main/java/com/pqt/client/module/ClientBackEndModuleManager.java
new file mode 100644
index 00000000..d7c12a3b
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/module/ClientBackEndModuleManager.java
@@ -0,0 +1,48 @@
+package com.pqt.client.module;
+
+import com.pqt.client.module.account.AccountService;
+import com.pqt.client.module.connection.ConnectionService;
+import com.pqt.client.module.network.NetworkService;
+import com.pqt.client.module.query.QueryExecutor;
+import com.pqt.client.module.sale.SaleService;
+import com.pqt.client.module.stat.StatService;
+import com.pqt.client.module.stock.StockService;
+
+public class ClientBackEndModuleManager {
+
+ private final SaleService saleService;
+ private final StockService stockService;
+ private final AccountService accountService;
+ private final StatService statService;
+ private final NetworkService networkService;
+
+ public ClientBackEndModuleManager(String serverUrl) {
+ ConnectionService connectionService = new ConnectionService(serverUrl);
+ QueryExecutor queryExecutor = new QueryExecutor(connectionService);
+ saleService = new SaleService(queryExecutor);
+ stockService = new StockService(queryExecutor);
+ accountService = new AccountService(queryExecutor);
+ statService = new StatService(queryExecutor);
+ networkService = new NetworkService(queryExecutor, connectionService);
+ }
+
+ public SaleService getSaleService() {
+ return saleService;
+ }
+
+ public StockService getStockService() {
+ return stockService;
+ }
+
+ public AccountService getAccountService() {
+ return accountService;
+ }
+
+ public StatService getStatService() {
+ return statService;
+ }
+
+ public NetworkService getNetworkService() {
+ return networkService;
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/account/AccountService.java b/Workspace/client/src/main/java/com/pqt/client/module/account/AccountService.java
index 9f6c76a0..08c35435 100644
--- a/Workspace/client/src/main/java/com/pqt/client/module/account/AccountService.java
+++ b/Workspace/client/src/main/java/com/pqt/client/module/account/AccountService.java
@@ -1,48 +1,123 @@
package com.pqt.client.module.account;
+import com.pqt.client.module.query.QueryExecutor;
+import com.pqt.client.module.query.query_callback.ICollectionItemMessageCallback;
+import com.pqt.client.module.query.query_callback.INoItemMessageCallback;
+import com.pqt.core.entities.product.Product;
import com.pqt.core.entities.user_account.Account;
import com.pqt.client.module.account.listeners.IAccountListener;
+import javax.swing.event.EventListenerList;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
-//TODO écrire contenu méthodes
//TODO écrire javadoc
//TODO add log lines
+//TODO supporter la modif de comptes
public class AccountService {
+ private QueryExecutor executor;
+ private Account currentAccount;
+ private boolean connected;
+ private Collection accounts;
+ private EventListenerList listenerList;
+
+ public AccountService(QueryExecutor executor){
+ this.executor = executor;
+ listenerList = new EventListenerList();
+ accounts = new ArrayList<>();
+ }
+
public Account getCurrentAccount() {
- return null;
+ return currentAccount;
}
public void setCurrentAccount(Account account) {
-
+ if(connected)
+ logOutCurrentAccount();
+ this.currentAccount = account;
}
public boolean isCurrentAccountLoggedIn() {
- return false;
+ return connected;
}
public void logInCurrentAccount(String password) {
-
+ setCurrentAccountState(password, true);
}
public void logOutCurrentAccount() {
-
+ setCurrentAccountState(null, false);
}
- public List getRecentAccounts() {
- return null;
- }
+ private void setCurrentAccountState(String password, boolean state){
+ if(currentAccount!=null && connected!=state) {
+ Account acc = new Account(currentAccount);
+ acc.setPassword(password);
+ executor.executeConnectAccountQuery(acc, state, new INoItemMessageCallback() {
+ @Override
+ public void ack() {
+ if (currentAccount != null
+ && connected != state
+ && currentAccount.getUsername().equals(acc.getUsername())
+ && currentAccount.getPermissionLevel().equals(acc.getPermissionLevel())) {
+ connected = state;
+ Arrays.stream(listenerList.getListeners(IAccountListener.class))
+ .forEach(l->l.onAccountStatusChangedEvent(connected));
+ }else
+ Arrays.stream(listenerList.getListeners(IAccountListener.class))
+ .forEach(l->l.onAccountStatusNotChangedEvent(
+ new IllegalStateException("Account service not in the right state")
+ ));
+ }
+
+ @Override
+ public void err(Throwable cause) {
+ Arrays.stream(listenerList.getListeners(IAccountListener.class))
+ .forEach(l->l.onAccountStatusNotChangedEvent(cause));
+ }
+
+ @Override
+ public void ref(Throwable cause) {
+ Arrays.stream(listenerList.getListeners(IAccountListener.class))
+ .forEach(l->l.onAccountStatusNotChangedEvent(cause));
+ }
+ });
+ }
+ }
public void addListener(IAccountListener listener) {
-
+ listenerList.add(IAccountListener.class, listener);
}
public void removeListener(IAccountListener listener) {
-
+ listenerList.remove(IAccountListener.class, listener);
}
- public List getAllAccounts() {
- return null;
+ public Collection getAllAccounts() {
+ return accounts;
+ }
+
+ public void refreshAccounts(){
+ executor.executeAccountListQuery(new ICollectionItemMessageCallback() {
+ @Override
+ public void err(Throwable cause) {
+
+ }
+
+ @Override
+ public void ref(Throwable cause) {
+
+ }
+
+ @Override
+ public void ack(Collection obj) {
+ accounts = obj;
+ Arrays.stream(listenerList.getListeners(IAccountListener.class))
+ .forEach(IAccountListener::onAccountListChangedEvent);
+ }
+ });
}
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/account/listeners/AccountListenerAdapter.java b/Workspace/client/src/main/java/com/pqt/client/module/account/listeners/AccountListenerAdapter.java
index 6abd0649..cf29f75a 100644
--- a/Workspace/client/src/main/java/com/pqt/client/module/account/listeners/AccountListenerAdapter.java
+++ b/Workspace/client/src/main/java/com/pqt/client/module/account/listeners/AccountListenerAdapter.java
@@ -8,13 +8,23 @@ public class AccountListenerAdapter implements IAccountListener {
/**
* @see com.pqt.client.module.account.listeners.IAccountListener#onAccountStatusChangedEvent(boolean)
*/
+ @Override
public void onAccountStatusChangedEvent(boolean status) {
}
+ /**
+ * @see com.pqt.client.module.account.listeners.IAccountListener#onAccountStatusNotChangedEvent(Throwable)
+ */
+ @Override
+ public void onAccountStatusNotChangedEvent(Throwable cause) {
+
+ }
+
/**
* @see com.pqt.client.module.account.listeners.IAccountListener#onAccountListChangedEvent()
*/
+ @Override
public void onAccountListChangedEvent() {
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/account/listeners/IAccountListener.java b/Workspace/client/src/main/java/com/pqt/client/module/account/listeners/IAccountListener.java
index 0de33085..821f3798 100644
--- a/Workspace/client/src/main/java/com/pqt/client/module/account/listeners/IAccountListener.java
+++ b/Workspace/client/src/main/java/com/pqt/client/module/account/listeners/IAccountListener.java
@@ -5,5 +5,6 @@ import java.util.EventListener;
public interface IAccountListener extends EventListener {
void onAccountStatusChangedEvent(boolean status);
+ void onAccountStatusNotChangedEvent(Throwable cause);
void onAccountListChangedEvent();
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/connection/ConnectionService.java b/Workspace/client/src/main/java/com/pqt/client/module/connection/ConnectionService.java
index 71757842..48ddabc8 100644
--- a/Workspace/client/src/main/java/com/pqt/client/module/connection/ConnectionService.java
+++ b/Workspace/client/src/main/java/com/pqt/client/module/connection/ConnectionService.java
@@ -1,46 +1,66 @@
package com.pqt.client.module.connection;
import com.pqt.client.module.connection.listeners.IConnectionListener;
+import com.pqt.client.module.connection.senders.HttpTextSender;
+import com.pqt.client.module.connection.senders.ITextSender;
+
+import java.util.concurrent.*;
-//TODO écrire contenu méthodes
//TODO écrire javadoc
-//TODO add log lines?
public class ConnectionService {
- public boolean isConnectedToServer() {
- return false;
+ private String serverUrl;
+ private ExecutorService executor;
+ private ITextSender textSender;
+
+ public ConnectionService(String serverUrl) {
+ executor = new ThreadPoolExecutor(1, 1, 1000,
+ TimeUnit.SECONDS, new LinkedBlockingQueue<>());
+ this.serverUrl = serverUrl;
+ this.textSender = new HttpTextSender();
+ }
+
+ public String getServerUrl() {
+ return serverUrl;
}
- public void connectToServer(String ip_address) {
-
- }
-
- public void disconnectFromServer() {
-
- }
-
- public String getCurrentServerIpAddress() {
- return null;
- }
-
- public void start() {
-
- }
-
- public void stop() {
-
- }
-
- public void sendText(String text) {
-
- }
-
- public void addListener(IConnectionListener listener) {
-
- }
-
- public void removeListener(IConnectionListener listener) {
+ public void setServerUrl(String url){
+ this.serverUrl = url;
+ }
+ /**
+ * Arrête le service d'envoi.
+ *
+ * Si ce service est arrêté, il ne sera plus possible de l'utiliser, et ne pourra pas être redémarré. Une
+ * autre isntance devra être utilisée pour pouvoir recommencer à se servir de ce service.
+ *
+ * Si {@code force} vaut true, le service tentera d'interrompre tous les envois de texte en cours, même s'il ne
+ * sont pas terminés. Sinon, le service attendra que tous les envois en cours soient terminé avant de s'arrêter, mais
+ * n'acceptera pas de nouveaux envois.
+ * @param force {@code true} si l'arrêt du service doit être forcé, {@code false} sinon
+ */
+ public void stop(boolean force) {
+ if(executor!=null)
+ if(force)
+ executor.shutdownNow();
+ else
+ executor.shutdown();
}
+ /**
+ * Envoie la chaîne de caractères {@code text} au serveur de donnée correspondant à l'URL {@link #getServerUrl()}, et
+ * utilise {@code listener} pour notifier l'avancement de l'envoi.
+ *
+ * @param text texte à envoyer
+ * @param listener listener à utiliser pour notifier l'avancement de l'envoi (voir {@link IConnectionListener})
+ * @throws IllegalStateException Si l'url du serveur vaut {@code null} (à spécifier à la constructyion ou avec
+ * {@link #setServerUrl(String)}, ou si le service à été arrêté via la méthode {@link #stop(boolean)}.
+ */
+ public void sendText(String text, IConnectionListener listener) throws IllegalStateException{
+ if(serverUrl==null)
+ throw new IllegalStateException("No url specified for data server");
+ if(executor.isShutdown() || executor.isTerminated())
+ throw new IllegalStateException("Service was shut down : unable to send text");
+ executor.submit(()->textSender.send(serverUrl, text, listener));
+ }
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/ConnectionListenerAdapter.java b/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/ConnectionListenerAdapter.java
index 1b99f8fa..a681450a 100644
--- a/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/ConnectionListenerAdapter.java
+++ b/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/ConnectionListenerAdapter.java
@@ -1,7 +1,5 @@
package com.pqt.client.module.connection.listeners;
-//TODO écrire contenu méthodes
-//TODO écrire javadoc
public class ConnectionListenerAdapter implements IConnectionListener {
@@ -10,6 +8,7 @@ public class ConnectionListenerAdapter implements IConnectionListener {
*
*
*/
+ @Override
public void onMessageReceivedEvent(String msg) {
}
@@ -20,6 +19,7 @@ public class ConnectionListenerAdapter implements IConnectionListener {
*
*
*/
+ @Override
public void onConnectedEvent() {
}
@@ -30,8 +30,20 @@ public class ConnectionListenerAdapter implements IConnectionListener {
*
*
*/
+ @Override
public void onDisconnectedEvent() {
}
+
+ /**
+ * @see com.pqt.client.module.connection.listeners.IConnectionListener#onTimeOutEvent()
+ *
+ *
+ */
+ @Override
+ public void onTimeOutEvent() {
+
+ }
+
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/IConnectionFirerer.java b/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/IConnectionFirerer.java
index 4afdde4d..a9a24609 100644
--- a/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/IConnectionFirerer.java
+++ b/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/IConnectionFirerer.java
@@ -2,14 +2,16 @@ package com.pqt.client.module.connection.listeners;
public interface IConnectionFirerer {
- public abstract void fireMessageReceivedEvent(String msg);
+ void fireMessageReceivedEvent(String msg);
- public abstract void fireConnectedEvent();
+ void fireConnectedEvent();
- public abstract void fireDisconnectedEvent();
+ void fireDisconnectedEvent();
- public abstract void addListener(IConnectionListener listener);
+ void fireTimeOutEvent();
- public abstract void removeListener(IConnectionListener listener);
+ void addListener(IConnectionListener listener);
+
+ void removeListener(IConnectionListener listener);
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/IConnectionListener.java b/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/IConnectionListener.java
index c04b3b52..1444d908 100644
--- a/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/IConnectionListener.java
+++ b/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/IConnectionListener.java
@@ -4,10 +4,12 @@ import java.util.EventListener;
public interface IConnectionListener extends EventListener {
- public abstract void onMessageReceivedEvent(String msg);
+ void onMessageReceivedEvent(String msg);
- public abstract void onConnectedEvent();
+ void onConnectedEvent();
- public abstract void onDisconnectedEvent();
+ void onDisconnectedEvent();
+
+ void onTimeOutEvent();
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/SimpleConnectionFirerer.java b/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/SimpleConnectionFirerer.java
index d8bbf425..e4b2f47f 100644
--- a/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/SimpleConnectionFirerer.java
+++ b/Workspace/client/src/main/java/com/pqt/client/module/connection/listeners/SimpleConnectionFirerer.java
@@ -1,49 +1,67 @@
package com.pqt.client.module.connection.listeners;
-//TODO écrire contenu méthodes
-//TODO écrire javadoc
+import javax.swing.event.EventListenerList;
+import java.util.Arrays;
+
public class SimpleConnectionFirerer implements IConnectionFirerer {
+ private EventListenerList listenerList;
+
+ public SimpleConnectionFirerer() {
+ listenerList = new EventListenerList();
+ }
/**
* @see com.pqt.client.module.connection.listeners.IConnectionFirerer#fireMessageReceivedEvent(String)
- *
- *
+ *
*/
+ @Override
public void fireMessageReceivedEvent(String msg) {
-
+ Arrays.stream(listenerList.getListeners(IConnectionListener.class)).forEach(listener->listener.onMessageReceivedEvent(msg));
}
/**
* @see com.pqt.client.module.connection.listeners.IConnectionFirerer#fireConnectedEvent()
*/
+ @Override
public void fireConnectedEvent() {
-
+ Arrays.stream(listenerList.getListeners(IConnectionListener.class)).forEach(IConnectionListener::onConnectedEvent);
}
/**
* @see com.pqt.client.module.connection.listeners.IConnectionFirerer#fireDisconnectedEvent()
*/
+ @Override
public void fireDisconnectedEvent() {
-
+ Arrays.stream(listenerList.getListeners(IConnectionListener.class)).forEach(IConnectionListener::onDisconnectedEvent);
}
+ /**
+ * @see com.pqt.client.module.connection.listeners.IConnectionFirerer#fireTimeOutEvent()
+ */
+ @Override
+ public void fireTimeOutEvent() {
+ Arrays.stream(listenerList.getListeners(IConnectionListener.class)).forEach(IConnectionListener::onDisconnectedEvent);
+ }
- /**
+
+ /**
* @see com.pqt.client.module.connection.listeners.IConnectionFirerer#addListener(com.pqt.client.module.connection.listeners.IConnectionListener)
*/
+ @Override
public void addListener(IConnectionListener listener) {
-
+ listenerList.add(IConnectionListener.class, listener);
}
/**
* @see com.pqt.client.module.connection.listeners.IConnectionFirerer#removeListener(com.pqt.client.module.connection.listeners.IConnectionListener)
*/
+ @Override
public void removeListener(IConnectionListener listener) {
-
+ listenerList.remove(IConnectionListener.class, listener);
}
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/connection/senders/HttpTextSender.java b/Workspace/client/src/main/java/com/pqt/client/module/connection/senders/HttpTextSender.java
new file mode 100644
index 00000000..993d434f
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/module/connection/senders/HttpTextSender.java
@@ -0,0 +1,53 @@
+package com.pqt.client.module.connection.senders;
+
+import com.pqt.client.module.connection.listeners.IConnectionListener;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+
+public class HttpTextSender implements ITextSender{
+ @Override
+ public void send(String url, String text, IConnectionListener listener) {
+ try {
+ HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
+ con.setRequestMethod("GET");
+ con.setRequestProperty("Content-Type", "application/json");
+ con.setConnectTimeout(5000);
+ con.setReadTimeout(5000);
+ con.setInstanceFollowRedirects(true);
+
+ String params = URLEncoder.encode("message="+text, "UTF-8");
+ con.setDoOutput(true);
+ try(DataOutputStream out = new DataOutputStream(con.getOutputStream())) {
+ out.writeBytes(params);
+ out.flush();
+ }
+ con.connect();
+ listener.onConnectedEvent();
+
+ try(BufferedReader in = new BufferedReader(
+ new InputStreamReader(con.getInputStream()))) {
+ StringBuilder content = new StringBuilder();
+ String inputLine;
+ while ((inputLine = in.readLine()) != null) {
+ content.append(inputLine);
+ }
+ listener.onMessageReceivedEvent(content.toString());
+ }
+
+ con.disconnect();
+
+ }catch (java.net.SocketTimeoutException e){
+ listener.onTimeOutEvent();
+ }catch (IOException e) {
+ e.printStackTrace();
+ }finally {
+ listener.onDisconnectedEvent();
+ }
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/connection/senders/ITextSender.java b/Workspace/client/src/main/java/com/pqt/client/module/connection/senders/ITextSender.java
new file mode 100644
index 00000000..e269dbcd
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/module/connection/senders/ITextSender.java
@@ -0,0 +1,7 @@
+package com.pqt.client.module.connection.senders;
+
+import com.pqt.client.module.connection.listeners.IConnectionListener;
+
+public interface ITextSender {
+ void send(String url, String text, IConnectionListener listener);
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/network/NetworkService.java b/Workspace/client/src/main/java/com/pqt/client/module/network/NetworkService.java
new file mode 100644
index 00000000..154265d6
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/module/network/NetworkService.java
@@ -0,0 +1,140 @@
+package com.pqt.client.module.network;
+
+import com.pqt.client.module.connection.ConnectionService;
+import com.pqt.client.module.network.listeners.INetworkServiceListener;
+import com.pqt.client.module.query.QueryExecutor;
+import com.pqt.client.module.query.query_callback.IMapItemMessageCallback;
+import com.pqt.client.module.query.query_callback.INoItemMessageCallback;
+import com.pqt.core.entities.server_config.ConfigFields;
+import com.pqt.core.entities.server_config.ServerConfig;
+
+import javax.swing.event.EventListenerList;
+import java.util.*;
+
+//TODO ajout javadoc
+
+/*
+ * Ce service doit permettre de faire des ping et de récupérer la config d'un serveur distant
+ */
+public class NetworkService {
+
+ private final QueryExecutor queryExecutor;
+ private final ConnectionService connectionService;
+ private final EventListenerList listenerList;
+ private final ServerConfigCache configCache;
+
+ public NetworkService(QueryExecutor queryExecutor, ConnectionService connectionService) {
+ this.queryExecutor = queryExecutor;
+ this.connectionService = connectionService;
+ listenerList = new EventListenerList();
+ configCache = new ServerConfigCache();
+ }
+
+ public void addListener(INetworkServiceListener l){
+ listenerList.add(INetworkServiceListener.class, l);
+ }
+
+ public void removeListener(INetworkServiceListener l){
+ listenerList.remove(INetworkServiceListener.class, l);
+ }
+
+ public void sendPQTPing(String host, Integer port){
+ checkData(host, port);
+ queryExecutor.executePingQuery(new INoItemMessageCallback() {
+ @Override
+ public void ack() {
+ Arrays.stream(listenerList.getListeners(INetworkServiceListener.class))
+ .forEach(l->l.onPQTPingSuccessEvent(host, port));
+ sendConfigRequest(host, port);
+ }
+
+ @Override
+ public void err(Throwable cause) {
+ Arrays.stream(listenerList.getListeners(INetworkServiceListener.class))
+ .forEach(l->l.onPQTPingFailureEvent(host, port, cause));
+ }
+
+ @Override
+ public void ref(Throwable cause) {
+ Arrays.stream(listenerList.getListeners(INetworkServiceListener.class))
+ .forEach(l->l.onPQTPingFailureEvent(host, port, cause));
+ }
+ });
+ }
+
+ public boolean hasServerConfig(String host, Integer port){
+ checkData(host, port);
+ return configCache.hasConfig(host, port);
+ }
+
+ public ServerConfig getServerConfig(String host, Integer port){
+ checkData(host, port);
+ return configCache.getConfig(host, port);
+ }
+
+ public void setActiveServer(String host, Integer port){
+ connectionService.setServerUrl(String.format("%s:%s", host, port));
+ }
+
+ private void sendConfigRequest(String host, Integer port){
+ queryExecutor.executeConfigListQuery(new IMapItemMessageCallback(){
+
+ @Override
+ public void err(Throwable cause) {
+ //TODO ajouter log erreur
+ }
+
+ @Override
+ public void ref(Throwable cause) {
+ //TODO ajouter log erreur
+ }
+
+ @Override
+ public void ack(Map obj) {
+ configCache.addServerConfig(host, port, convertToServerConfig(obj));
+ Arrays.stream(listenerList.getListeners(INetworkServiceListener.class))
+ .forEach(INetworkServiceListener::onNewServerConfigData);
+ }
+ });
+ }
+
+ private ServerConfig convertToServerConfig(Map data){
+
+ ServerConfig serverConfig = new ServerConfig();
+ List allowedFields = new ArrayList<>();
+ EnumSet.allOf(ConfigFields.class).forEach(e->allowedFields.add(e.name()));
+
+ data.keySet()
+ .stream()
+ .filter(allowedFields::contains)
+ .filter(key->isBoolean(data.get(key)))
+ .forEach(key->serverConfig.add(getMatchingConfigFields(key), Boolean.parseBoolean(data.get(key))));
+
+ return serverConfig;
+ }
+
+ private boolean isBoolean(String str){
+ return str.equals("true") || str.equals("false");
+ }
+
+ private ConfigFields getMatchingConfigFields(String str){
+ ConfigFields match = null;
+
+ EnumSet enumSet = EnumSet.allOf(ConfigFields.class);
+ for(ConfigFields field : enumSet){
+ if(str.equals(field.name()))
+ match = field;
+ }
+
+ return match;
+ }
+
+ private void checkData(String host, Integer port){
+ if(host==null || port == null)
+ throw new NullPointerException("Null value as server data is not allowed");
+ if(host.isEmpty())
+ throw new IllegalArgumentException("host cannot be empty");
+ if(port<1 || port>65535)
+ throw new IllegalArgumentException("port number must be an unsigned 16-bit integer (0 cache;
+
+ public ServerConfigCache() {
+ cache = new HashMap<>();
+ }
+
+ public void addServerConfig(String host, Integer port, ServerConfig config){
+ ServerData match = cache.keySet().stream().filter(key->key.getHost().equals(host)&&key.getPort().equals(port)).findFirst().orElse(null);
+ if(match==null){
+ cache.put(new ServerData(host, port), config);
+ }else{
+ cache.replace(match, config);
+ }
+ }
+
+ public void removeServerData(String host, Integer port){
+ ServerData data = new ServerData(host, port);
+ if(cache.containsKey(data))
+ cache.remove(data);
+ }
+
+ public boolean hasConfig(String host, Integer port){
+ return cache.containsKey(new ServerData(host, port));
+ }
+
+ public ServerConfig getConfig(String host, Integer port){
+ if(hasConfig(host, port))
+ return cache.get(new ServerData(host, port));
+
+ return null;
+ }
+
+ private class ServerData{
+ private String host;
+ private Integer port;
+
+ public ServerData(String host, Integer port) {
+ this.host = host;
+ this.port = port;
+ }
+
+ public String getHost() {
+ return host;
+ }
+
+ public Integer getPort() {
+ return port;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ ServerData that = (ServerData) o;
+
+ if (host != null ? !host.equals(that.host) : that.host != null) return false;
+ return port != null ? port.equals(that.port) : that.port == null;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = host != null ? host.hashCode() : 0;
+ result = 31 * result + (port != null ? port.hashCode() : 0);
+ return result;
+ }
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/network/listeners/INetworkServiceListener.java b/Workspace/client/src/main/java/com/pqt/client/module/network/listeners/INetworkServiceListener.java
new file mode 100644
index 00000000..33ed8073
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/module/network/listeners/INetworkServiceListener.java
@@ -0,0 +1,9 @@
+package com.pqt.client.module.network.listeners;
+
+import java.util.EventListener;
+
+public interface INetworkServiceListener extends EventListener {
+ void onPQTPingSuccessEvent(String host, Integer port);
+ void onPQTPingFailureEvent(String host, Integer port, Throwable cause);
+ void onNewServerConfigData();
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/query/QueryExecutor.java b/Workspace/client/src/main/java/com/pqt/client/module/query/QueryExecutor.java
index 63167cee..0472a3a5 100644
--- a/Workspace/client/src/main/java/com/pqt/client/module/query/QueryExecutor.java
+++ b/Workspace/client/src/main/java/com/pqt/client/module/query/QueryExecutor.java
@@ -1,35 +1,170 @@
package com.pqt.client.module.query;
-import com.pqt.client.module.query.query_callback.IIdQueryCallback;
-import com.pqt.core.entities.query.IQuery;
-import com.pqt.client.module.query.query_callback.ISimpleQueryCallback;
-import com.pqt.client.module.query.query_callback.IStatQueryCallback;
-import com.pqt.client.module.query.query_callback.IStockQueryCallback;
+import com.pqt.client.module.connection.ConnectionService;
+import com.pqt.client.module.connection.listeners.IConnectionListener;
+import com.pqt.client.module.query.exceptions.HeaderNotFoundException;
+import com.pqt.client.module.query.exceptions.MessageTimeoutException;
+import com.pqt.client.module.query.query_callback.*;
+import com.pqt.core.communication.GSonMessageToolFactory;
+import com.pqt.core.communication.IMessageToolFactory;
+import com.pqt.core.entities.messages.Message;
+import com.pqt.core.entities.messages.MessageType;
+import com.pqt.core.entities.product.Product;
+import com.pqt.core.entities.product.ProductUpdate;
+import com.pqt.core.entities.sale.Sale;
+import com.pqt.core.entities.user_account.Account;
+
+import java.util.List;
-//TODO écrire contenu méthodes
//TODO écrire javadoc
public class QueryExecutor {
- public static final QueryExecutor INSTANCE = new QueryExecutor();
-
- private QueryExecutor(){
+ private IMessageToolFactory messageToolFactory;
+ private ConnectionService connectionService;
+ private QueryMessageFactory messageFactory;
+ public QueryExecutor(ConnectionService connectionService){
+ messageToolFactory = new GSonMessageToolFactory();
+ this.connectionService = connectionService;
+ this.messageFactory = new QueryMessageFactory(messageToolFactory);
}
- public long execute(IQuery query, ISimpleQueryCallback callback) {
- return 0;
- }
-
- public long execute(IQuery query, IStatQueryCallback callback) {
- return 0;
- }
-
- public long execute(IQuery query, IStockQueryCallback callback) {
- return 0;
- }
-
- public long execute(IQuery query, IIdQueryCallback callback) {
- return 0;
+ public void executeSaleQuery(Sale sale, INoItemMessageCallback callback) {
+ sendMessage(messageFactory.newSaleMessage(sale), callback, MessageType.ACK_SALE);
}
+ public void executePingQuery(INoItemMessageCallback callback){
+ sendMessage(messageFactory.newPingMessage(), callback, MessageType.ACK_PING);
+ }
+
+ public void executeUpdateQuery(List updates, INoItemMessageCallback callback) {
+ sendMessage(messageFactory.newUpdateMessage(updates), callback, MessageType.ACK_UPDATE);
+ }
+
+ public void executeConnectAccountQuery(Account account, boolean desiredState, INoItemMessageCallback callback){
+ sendMessage(messageFactory.newConnectAccountMessage(account,desiredState), callback, MessageType.ACK_CONNECT_ACCOUNT);
+ }
+
+ private void sendMessage(Message message, INoItemMessageCallback callback, MessageType responseType){
+ connectionService.sendText(messageToolFactory.getObjectFormatter(Message.class).format(message), new IConnectionListener() {
+ @Override
+ public void onMessageReceivedEvent(String msg) {
+ Message response = messageToolFactory.getObjectParser(Message.class).parse(msg);
+ if(response.getType().equals(responseType))
+ callback.ack();
+ else
+ handleUnexpectedTypeInResponse(response, callback);
+ }
+
+ @Override
+ public void onConnectedEvent() {
+
+ }
+
+ @Override
+ public void onDisconnectedEvent() {
+
+ }
+
+ @Override
+ public void onTimeOutEvent() {
+ callback.err(new MessageTimeoutException());
+ }
+ });
+ }
+
+ public void executeStockQuery(ICollectionItemMessageCallback callback) {
+ sendMessage(messageFactory.newStockMessage(), callback, Product.class, MessageType.MSG_STOCK, "stock");
+ }
+
+ public void executeAccountListQuery(ICollectionItemMessageCallback callback){
+ sendMessage(messageFactory.newAccountListMessage(), callback, Account.class, MessageType.MSG_ACCOUNT_LIST, "accounts");
+ }
+
+ private void sendMessage(Message message, ICollectionItemMessageCallback callback, Class clazz, MessageType responseType, String itemHeader){
+ connectionService.sendText(messageToolFactory.getObjectFormatter(Message.class).format(message), new IConnectionListener() {
+ @Override
+ public void onMessageReceivedEvent(String msg) {
+ Message response = messageToolFactory.getObjectParser(Message.class).parse(msg);
+ if(response.getType().equals(responseType)) {
+ String item = response.getField(itemHeader);
+ if (item != null)
+ callback.ack(messageToolFactory.getListParser(clazz).parse(item));
+ else
+ callback.err(new HeaderNotFoundException("Missing expected header \""+
+ itemHeader+"\" in response \""+responseType.name()+"\""));
+ }else
+ handleUnexpectedTypeInResponse(response, callback);
+ }
+
+ @Override
+ public void onConnectedEvent() {
+
+ }
+
+ @Override
+ public void onDisconnectedEvent() {
+
+ }
+
+ @Override
+ public void onTimeOutEvent() {
+ callback.err(new MessageTimeoutException());
+ }
+ });
+ }
+
+ public void executeStatQuery(IMapItemMessageCallback callback) {
+ sendMessage(messageFactory.newStatMessage(), callback, MessageType.MSG_STAT);
+ }
+
+ public void executeConfigListQuery(IMapItemMessageCallback callback){
+ sendMessage(messageFactory.newConfigListMessage(), callback, MessageType.MSG_CONFIG_LIST);
+ }
+
+ //TODO à rendre générique pour toute Map au lieu de Map
+ private void sendMessage(Message message, IMapItemMessageCallback callback, MessageType responseType){
+ connectionService.sendText(messageToolFactory.getObjectFormatter(Message.class).format(message), new IConnectionListener() {
+ @Override
+ public void onMessageReceivedEvent(String msg) {
+ Message response = messageToolFactory.getObjectParser(Message.class).parse(msg);
+ if(response.getType().equals(responseType)){
+ callback.ack(response.getFields());
+ }else
+ handleUnexpectedTypeInResponse(response, callback);
+ }
+
+ @Override
+ public void onConnectedEvent() {
+
+ }
+
+ @Override
+ public void onDisconnectedEvent() {
+
+ }
+
+ @Override
+ public void onTimeOutEvent() {
+ callback.err(new MessageTimeoutException());
+ }
+ });
+ }
+
+ private void handleUnexpectedTypeInResponse(Message response, IMessageCallback callback){
+ switch (response.getType()) {
+ case ERROR_QUERY:
+ callback.err(messageToolFactory.getObjectParser(Throwable.class).parse(response.getField("Detail_erreur")));
+ break;
+ case REFUSED_QUERY:
+ callback.ref(messageToolFactory.getObjectParser(Throwable.class).parse(response.getField("Detail_refus")));
+ break;
+ default:
+ callback.err(new IllegalArgumentException(
+ "Illegal message type for response : " +
+ "expected \"ACK_SALE\"`, found \"" + response.getType().name() + "\""
+ ));
+ break;
+ }
+ }
}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/query/QueryFactory.java b/Workspace/client/src/main/java/com/pqt/client/module/query/QueryFactory.java
deleted file mode 100644
index 6335c44d..00000000
--- a/Workspace/client/src/main/java/com/pqt/client/module/query/QueryFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.pqt.client.module.query;
-
-import com.pqt.core.entities.product.ProductUpdate;
-import com.pqt.core.entities.query.IQuery;
-import com.pqt.core.entities.sale.Sale;
-import com.pqt.core.entities.user_account.Account;
-
-import java.util.List;
-
-//TODO écrire contenu méthodes
-//TODO écrire javadoc
-public class QueryFactory {
-
- public static IQuery newConnectQuery(String serverAddress) {
- return null;
- }
-
- public static IQuery newSaleQuery(Sale sale) {
- return null;
- }
-
- public static IQuery newStockQuery() {
- return null;
- }
-
- public static IQuery newStatQuery() {
- return null;
- }
-
- public static IQuery newLogQuery(Account account, boolean state) {
- return null;
- }
-
- public static IQuery newUpdateQuery(List updates) {
- return null;
- }
-
-}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/query/QueryMessageFactory.java b/Workspace/client/src/main/java/com/pqt/client/module/query/QueryMessageFactory.java
new file mode 100644
index 00000000..52e934c7
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/module/query/QueryMessageFactory.java
@@ -0,0 +1,69 @@
+package com.pqt.client.module.query;
+
+import com.pqt.core.communication.IMessageToolFactory;
+import com.pqt.core.entities.messages.Message;
+import com.pqt.core.entities.messages.MessageType;
+import com.pqt.core.entities.product.ProductUpdate;
+import com.pqt.core.entities.sale.Sale;
+import com.pqt.core.entities.user_account.Account;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+//TODO écrire javadoc
+class QueryMessageFactory {
+
+ private final IMessageToolFactory messageToolFactory;
+
+ QueryMessageFactory(IMessageToolFactory messageToolFactory) {
+ this.messageToolFactory = messageToolFactory;
+ }
+
+ Message newSaleMessage(Sale sale) {
+ Map fields = new HashMap<>();
+ fields.put("sale", messageToolFactory.getObjectFormatter(Sale.class).format(sale));
+ return newSimpleMessage(MessageType.QUERY_SALE, fields);
+ }
+
+ Message newStockMessage() {
+ return newSimpleMessage(MessageType.QUERY_STOCK);
+ }
+
+ Message newStatMessage() {
+ return newSimpleMessage(MessageType.QUERY_STAT);
+ }
+
+ Message newUpdateMessage(List updates) {
+ Map fields = new HashMap<>();
+ fields.put("updates", messageToolFactory.getListFormatter(ProductUpdate.class).format(updates));
+ return newSimpleMessage(MessageType.QUERY_UPDATE, fields);
+ }
+
+ Message newAccountListMessage(){
+ return newSimpleMessage(MessageType.QUERY_ACCOUNT_LIST);
+ }
+
+ Message newConnectAccountMessage(Account account, boolean desiredState){
+ Map fields = new HashMap<>();
+ fields.put("account", messageToolFactory.getObjectFormatter(Account.class).format(account));
+ fields.put("desired_state", messageToolFactory.getObjectFormatter(Boolean.class).format(desiredState));
+ return newSimpleMessage(MessageType.QUERY_CONNECT_ACCOUNT, fields);
+ }
+
+ Message newPingMessage(){
+ return newSimpleMessage(MessageType.QUERY_PING);
+ }
+
+ Message newConfigListMessage(){
+ return newSimpleMessage(MessageType.QUERY_CONFIG_LIST);
+ }
+
+ private Message newSimpleMessage(MessageType type, Map fields){
+ return new Message(type, null, null, null, null, fields);
+ }
+
+ private Message newSimpleMessage(MessageType type){
+ return newSimpleMessage(type, null);
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/query/exceptions/HeaderNotFoundException.java b/Workspace/client/src/main/java/com/pqt/client/module/query/exceptions/HeaderNotFoundException.java
new file mode 100644
index 00000000..5ce2a4b1
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/module/query/exceptions/HeaderNotFoundException.java
@@ -0,0 +1,19 @@
+package com.pqt.client.module.query.exceptions;
+
+public class HeaderNotFoundException extends Exception {
+ public HeaderNotFoundException() {
+ super();
+ }
+
+ public HeaderNotFoundException(String message) {
+ super(message);
+ }
+
+ public HeaderNotFoundException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public HeaderNotFoundException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/query/exceptions/MessageTimeoutException.java b/Workspace/client/src/main/java/com/pqt/client/module/query/exceptions/MessageTimeoutException.java
new file mode 100644
index 00000000..c25463af
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/module/query/exceptions/MessageTimeoutException.java
@@ -0,0 +1,19 @@
+package com.pqt.client.module.query.exceptions;
+
+public class MessageTimeoutException extends Exception {
+ public MessageTimeoutException() {
+ super();
+ }
+
+ public MessageTimeoutException(String message) {
+ super(message);
+ }
+
+ public MessageTimeoutException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public MessageTimeoutException(Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/query/query_callback/ICollectionItemMessageCallback.java b/Workspace/client/src/main/java/com/pqt/client/module/query/query_callback/ICollectionItemMessageCallback.java
new file mode 100644
index 00000000..95b5382b
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/module/query/query_callback/ICollectionItemMessageCallback.java
@@ -0,0 +1,6 @@
+package com.pqt.client.module.query.query_callback;
+
+import java.util.Collection;
+
+public interface ICollectionItemMessageCallback extends IItemMessageCallback> {
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/query/query_callback/IIdQueryCallback.java b/Workspace/client/src/main/java/com/pqt/client/module/query/query_callback/IIdQueryCallback.java
deleted file mode 100644
index 6abe97de..00000000
--- a/Workspace/client/src/main/java/com/pqt/client/module/query/query_callback/IIdQueryCallback.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.pqt.client.module.query.query_callback;
-
-public interface IIdQueryCallback {
- public void ack(long id);
- public void err(long id, Throwable cause);
- public void ref(long id, Throwable cause);
-}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/query/query_callback/IItemMessageCallback.java b/Workspace/client/src/main/java/com/pqt/client/module/query/query_callback/IItemMessageCallback.java
new file mode 100644
index 00000000..9aca2954
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/module/query/query_callback/IItemMessageCallback.java
@@ -0,0 +1,5 @@
+package com.pqt.client.module.query.query_callback;
+
+public interface IItemMessageCallback extends IMessageCallback {
+ void ack(T obj);
+}
diff --git a/Workspace/client/src/main/java/com/pqt/client/module/query/query_callback/IMapItemMessageCallback.java b/Workspace/client/src/main/java/com/pqt/client/module/query/query_callback/IMapItemMessageCallback.java
new file mode 100644
index 00000000..c9d4cb1a
--- /dev/null
+++ b/Workspace/client/src/main/java/com/pqt/client/module/query/query_callback/IMapItemMessageCallback.java
@@ -0,0 +1,7 @@
+package com.pqt.client.module.query.query_callback;
+
+
+import java.util.Map;
+
+public interface IMapItemMessageCallback extends IItemMessageCallback