diff --git a/clean_code_projects/_2_project_requirements_design_patterns/adminCredentials b/clean_code_projects/_2_project_requirements_design_patterns/adminCredentials new file mode 100644 index 000000000..304272c32 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/adminCredentials @@ -0,0 +1,2 @@ +admin +0711111111 \ No newline at end of file diff --git a/clean_code_projects/_2_project_requirements_design_patterns/persons.txt b/clean_code_projects/_2_project_requirements_design_patterns/persons.txt new file mode 100644 index 000000000..31641740f Binary files /dev/null and b/clean_code_projects/_2_project_requirements_design_patterns/persons.txt differ diff --git a/clean_code_projects/_2_project_requirements_design_patterns/pom.xml b/clean_code_projects/_2_project_requirements_design_patterns/pom.xml index 0e7eda697..851dbc9b8 100644 --- a/clean_code_projects/_2_project_requirements_design_patterns/pom.xml +++ b/clean_code_projects/_2_project_requirements_design_patterns/pom.xml @@ -1,15 +1,50 @@ - - - - clean_code_projects - brevity - 1.0-SNAPSHOT - + 4.0.0 - - _2_design_patterns_project - - + org.openjfx + ProiectAdevarat + 1.0-SNAPSHOT + + UTF-8 + 11 + 11 + + + + org.openjfx + javafx-controls + 15.0.1 + + + org.openjfx + javafx-fxml + 15.0.1 + + + org.jetbrains + annotations + RELEASE + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 11 + + + + org.openjfx + javafx-maven-plugin + 0.0.4 + + org.openjfx.App + + + + \ No newline at end of file diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/module-info.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/module-info.java new file mode 100644 index 000000000..2d416742b --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/module-info.java @@ -0,0 +1,12 @@ +module org.openjfx { + requires javafx.controls; + requires javafx.fxml; + + opens org.openjfx to javafx.fxml; + exports org.openjfx; + exports org.openjfx.controller; + exports org.openjfx.service; + exports org.openjfx.dao; + exports org.openjfx.model; + opens org.openjfx.controller to javafx.fxml; +} \ No newline at end of file diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/App.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/App.java new file mode 100644 index 000000000..ae2265a6b --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/App.java @@ -0,0 +1,44 @@ +package org.openjfx; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; +import javafx.stage.StageStyle; +import org.openjfx.util.InitApplication; + +import java.io.IOException; + +public class App extends Application { + + private static Scene scene; + private static Stage stage; + + @Override + public void start(Stage stage) throws IOException { + App.stage = stage; + scene = new Scene(loadFXML("login"), 360, 500); + stage.initStyle(StageStyle.TRANSPARENT); + stage.setScene(scene); + stage.show(); + } + + public static void setRoot(String fxml, int width, int height) throws IOException { + scene.setRoot(loadFXML(fxml)); + stage.setHeight(height); + stage.setWidth(width); + } + + private static Parent loadFXML(String fxml) throws IOException { + FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml")); + return fxmlLoader.load(); + } + + public static void main(String[] args) throws IOException { + InitApplication.initAdminCredentials(); + InitApplication.deserializeInitialTenants(); + InitApplication.loadTenantCredentials(); + launch(); + } +} \ No newline at end of file diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/controller/AdministratorController.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/controller/AdministratorController.java new file mode 100644 index 000000000..5efb2b39a --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/controller/AdministratorController.java @@ -0,0 +1,164 @@ +package org.openjfx.controller; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.collections.transformation.FilteredList; +import javafx.collections.transformation.SortedList; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.*; +import javafx.scene.control.cell.PropertyValueFactory; +import org.openjfx.App; +import org.openjfx.model.BillTypes; +import org.openjfx.model.Person; +import org.openjfx.model.Tenant; +import org.openjfx.service.LoginService; +import org.openjfx.service.PersonService; +import org.openjfx.service.TenantService; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.net.URL; +import java.util.ResourceBundle; + +public class AdministratorController implements Initializable { + + private TenantService tenantService; + private PersonService personService; + public TableColumn userName; + public TableColumn phoneNumber; + private final ObservableList dataList = FXCollections.observableArrayList(); + private final ObservableList comboBoxTopics = FXCollections.observableArrayList(); + private final ObservableList comboBoxTypes = FXCollections.observableArrayList(); + private final File personsFile = new File("persons.txt"); + + @FXML + public ComboBox typesCombobox; + @FXML + public TextField notifyTextField; + @FXML + public Button notifyButton; + @FXML + public TextField filterField; + @FXML + public TableView tableview; + @FXML + public ComboBox comboBox; + @FXML + public Button addTenant; + @FXML + public Button deleteTenant; + @FXML + public TextField userNameTenant; + @FXML + public TextField phoneNumberTenant; + + public void initTable() { + userName.setCellValueFactory(new PropertyValueFactory<>("userName")); + phoneNumber.setCellValueFactory(new PropertyValueFactory<>("phoneNumber")); + dataList.addAll(tenantService.selectAll()); + } + + public void constructSearchEngine() throws IOException { + FilteredList filteredData = new FilteredList<>(dataList, b -> true); + initTable(); + tableview.setItems(filteredData); + comboBoxTopics.addAll("userName", "phoneNumber"); + comboBox.setItems(comboBoxTopics); + filterField.textProperty().addListener((observable, oldValue, newValue) -> filteredData.setPredicate(person -> { + if (newValue == null || newValue.isEmpty()) { + return true; + } + String comboBoxValue = comboBox.getValue(); + String lowerCaseFilter = newValue.toLowerCase(); + switch (comboBoxValue) { + case "userName": { + return person.getUserName().toLowerCase().contains(lowerCaseFilter); + } + case "phoneNumber": { + return String.valueOf(person.getPhoneNumber()).toLowerCase().contains(lowerCaseFilter); + } + default: { + break; + } + } + return false; + })); + SortedList sortedData = new SortedList<>(filteredData); + sortedData.comparatorProperty().bind(tableview.comparatorProperty()); + tableview.setItems(sortedData); + tableview.getItems().forEach(System.out::println); + int isOk = 1; + } + + public void initBillTypeCombobox() { + for (BillTypes value : BillTypes.values()) { + comboBoxTypes.add(value.toString()); + } + typesCombobox.setItems(comboBoxTypes); + } + + public void addTenant() throws IOException { + Tenant toBeAdded = new Tenant(userNameTenant.getText(), Integer.parseInt(phoneNumberTenant.getText())); + personService.insert(toBeAdded); + tenantService.insert(toBeAdded); + FileOutputStream fileOutputStream = new FileOutputStream(personsFile); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); + for (Tenant tenant : tenantService.selectAll()) { + objectOutputStream.writeObject(tenant); + } + fileOutputStream.close(); + } + + public void deleteTenant() throws IOException { + Tenant toBeDeleted = new Tenant(userNameTenant.getText(), Integer.parseInt(phoneNumberTenant.getText())); + personService.delete(toBeDeleted); + tenantService.delete(toBeDeleted); + FileOutputStream fileOutputStream = new FileOutputStream(personsFile); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); + for (Tenant tenant : tenantService.selectAll()) { + objectOutputStream.writeObject(tenant); + } + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + setLoginService(LoginService.getInstance()); + setTenantService(TenantService.getInstance()); + setPersonService(PersonService.getInstance()); + initBillTypeCombobox(); + try { + constructSearchEngine(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void setLoginService(LoginService loginService) { + } + + public void setTenantService(TenantService tenantService) { + this.tenantService = tenantService; + } + + public void setPersonService(PersonService personService) { + this.personService = personService; + } + + public void sendNotificationsToTenant() { + for (Tenant tenant : tenantService.selectAll()) { + tenantService.notifyMe(notifyTextField.getText(), tenant, typesCombobox.getValue()); + } + } + + public void logout(ActionEvent actionEvent) throws IOException { + App.setRoot("login", 360, 500); + } + + public void showPayedBills() throws IOException { + App.setRoot("paidBills", 700, 540); + } +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/controller/LoginController.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/controller/LoginController.java new file mode 100644 index 000000000..ea229c844 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/controller/LoginController.java @@ -0,0 +1,67 @@ +package org.openjfx.controller; + +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import org.openjfx.App; +import org.openjfx.model.Person; +import org.openjfx.service.LoginService; + +import java.io.IOException; +import java.net.URL; +import java.util.ResourceBundle; + +public class LoginController implements Initializable { + + private LoginService loginService; + + @FXML + public TextField userTextField; + @FXML + public TextField phoneNumberTextField; + @FXML + public Label errorLabel; + + @Override + public void initialize(URL location, ResourceBundle resources) { + errorLabel.setVisible(false); + setLoginService(LoginService.getInstance()); + + } + + public int login() throws IOException { + + int idGrasper = 0; + if (checkIfFieldIsEmpty()) { + errorLabel.setText(" Some fields are let empty"); + errorLabel.setVisible(true); + } else { + Person formUser = new Person(userTextField.getText(), Integer.parseInt(phoneNumberTextField.getText())); + String option = loginService.logIn(formUser); + if (option != null) { + idGrasper = loginService.getIdGrasper(); + if (option.equals("TENANT")) { + App.setRoot("tenant", 800, 500); + } else + App.setRoot("administrator", 800, 520); + } else { + errorLabel.setText(" User does not exist"); + errorLabel.setVisible(true); + } + } + return idGrasper; + } + + public boolean checkIfFieldIsEmpty() { + return userTextField.getText().isBlank() || phoneNumberTextField.getText().isBlank(); + } + + public void register() throws IOException { + App.setRoot("register", 360, 500); + } + + public void setLoginService(LoginService loginService) { + this.loginService = loginService; + } +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/controller/PaidBillsController.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/controller/PaidBillsController.java new file mode 100644 index 000000000..d6d0bbb10 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/controller/PaidBillsController.java @@ -0,0 +1,49 @@ +package org.openjfx.controller; + +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.TextArea; +import org.openjfx.App; +import org.openjfx.model.Administrator; +import org.openjfx.service.AdministratorService; +import org.openjfx.util.InitApplication; + +import java.io.IOException; +import java.net.URL; +import java.util.ResourceBundle; + +public class PaidBillsController implements Initializable { + + @FXML + public TextArea notificationArea; + private AdministratorService administratorService; + + + public void logout(ActionEvent actionEvent) throws IOException { + App.setRoot("administrator", 800, 520); + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + setAdministratorService(AdministratorService.getInstance()); + notificationArea.setEditable(false); + try { + loadNotifications(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void loadNotifications() throws IOException { + administratorService.notifyMe(); + Administrator administrator = InitApplication.initAdminCredentials(); + for (String notification : administrator.getNotifications()) { + notificationArea.appendText(notification + "\n"); + } + } + + public void setAdministratorService(AdministratorService administratorService) { + this.administratorService = administratorService; + } +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/controller/TenantController.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/controller/TenantController.java new file mode 100644 index 000000000..bca34b8a4 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/controller/TenantController.java @@ -0,0 +1,96 @@ +package org.openjfx.controller; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.collections.transformation.FilteredList; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.TextArea; +import javafx.scene.control.cell.PropertyValueFactory; +import org.openjfx.App; +import org.openjfx.model.Bill; +import org.openjfx.model.Tenant; +import org.openjfx.service.AdministratorService; +import org.openjfx.service.LoginService; +import org.openjfx.service.TenantService; + +import java.io.IOException; +import java.net.URL; +import java.util.Date; +import java.util.ResourceBundle; + +public class TenantController implements Initializable { + + private LoginService loginService; + private TenantService tenantService; + private AdministratorService administratorService; + + @FXML + public TextArea notificationArea; + @FXML + public TableView tableview; + private final ObservableList dataList = FXCollections.observableArrayList(); + @FXML + public TableColumn id; + @FXML + public TableColumn type; + @FXML + public TableColumn dateOfRelease; + @FXML + public TableColumn status; + @FXML + public TableColumn dateOfPayment; + @FXML + public TableColumn totalAmount; + + public void showNotifications(ActionEvent actionEvent) { + FilteredList filteredData = new FilteredList<>(dataList, b -> true); + initTable(); + tableview.setItems(filteredData); + } + + public void logout(ActionEvent actionEvent) throws IOException { + App.setRoot("login", 360, 500); + } + + void initTable() { + id.setCellValueFactory(new PropertyValueFactory<>("ID")); + type.setCellValueFactory(new PropertyValueFactory<>("type")); + dateOfRelease.setCellValueFactory(new PropertyValueFactory<>("dateOfRelease")); + status.setCellValueFactory(new PropertyValueFactory<>("status")); + dateOfPayment.setCellValueFactory(new PropertyValueFactory<>("dateOfPayment")); + totalAmount.setCellValueFactory(new PropertyValueFactory<>("totalAmount")); + Tenant tenant = tenantService.findByPhoneNumber(loginService.getIdGrasper()); + dataList.addAll(tenant.getBills()); + } + + public void payBills() throws IOException { + Bill payedBill = tableview.getSelectionModel().getSelectedItem(); + Tenant tenant = tenantService.findByPhoneNumber(loginService.getIdGrasper()); + String notification = tenant.getUserName() + " " + payedBill; + administratorService.setCurrentNotification(notification); + administratorService.notifyMe(); + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + setLoginService(LoginService.getInstance()); + setTenantService(TenantService.getInstance()); + setAdministratorService(AdministratorService.getInstance()); + } + + public void setLoginService(LoginService loginService) { + this.loginService = loginService; + } + + public void setTenantService(TenantService tenantService) { + this.tenantService = tenantService; + } + + public void setAdministratorService(AdministratorService administratorService) { + this.administratorService = administratorService; + } +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/dao/AdministratorDao.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/dao/AdministratorDao.java new file mode 100644 index 000000000..9faa1edf3 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/dao/AdministratorDao.java @@ -0,0 +1,32 @@ +package org.openjfx.dao; + +import org.openjfx.model.Administrator; + +import java.util.List; + +public class AdministratorDao implements DAO{ + @Override + public Administrator findByPhoneNumber(Integer id) { + return null; + } + + @Override + public List selectAll() { + return null; + } + + @Override + public Administrator delete(Integer phoneNumber) { + return null; + } + + @Override + public Administrator insert(Administrator model) { + return null; + } + + @Override + public Administrator delete(Administrator model) { + return null; + } +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/dao/DAO.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/dao/DAO.java new file mode 100644 index 000000000..f3a035178 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/dao/DAO.java @@ -0,0 +1,16 @@ +package org.openjfx.dao; + +import java.util.List; + +public interface DAO { + T findByPhoneNumber(Integer id); + + List selectAll(); + + T delete(Integer phoneNumber); + + + T insert(T model); + + T delete(T model); +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/dao/PersonDao.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/dao/PersonDao.java new file mode 100644 index 000000000..34121d6d6 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/dao/PersonDao.java @@ -0,0 +1,53 @@ +package org.openjfx.dao; + +import org.openjfx.model.Person; + +import java.util.ArrayList; +import java.util.List; + +public class PersonDao implements DAO { + + private final List persons = new ArrayList<>(); + + @Override + public Person findByPhoneNumber(Integer phoneNumber) { + for (Person person : persons) { + if (person.getPhoneNumber().equals(phoneNumber)) { + return person; + } + } + return null; + } + + @Override + public List selectAll() { + return persons; + } + + @Override + public Person delete(Integer phoneNumber) { + Person user = findByPhoneNumber(phoneNumber); + if (user != null) { + persons.removeIf(user1 -> user1.equals(user)); + return user; + } else return null; + } + + + @Override + public Person insert(Person model) { + persons.add(model); + return model; + } + + @Override + public Person delete(Person model) { + Person person = findByPhoneNumber(model.getPhoneNumber()); + if (person != null) { + persons.remove(person); + } + return person; + } +} + + diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/dao/TenantDao.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/dao/TenantDao.java new file mode 100644 index 000000000..7dc9c0795 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/dao/TenantDao.java @@ -0,0 +1,51 @@ +package org.openjfx.dao; + +import org.openjfx.model.Tenant; + +import java.util.ArrayList; +import java.util.List; + +public class TenantDao implements DAO { + + private final List tenants = new ArrayList<>(); + + + @Override + public Tenant findByPhoneNumber(Integer phoneNumber) { + for (Tenant tenant : tenants) { + if (tenant.getPhoneNumber().equals(phoneNumber)) { + return tenant; + } + } + return null; + } + + @Override + public List selectAll() { + return tenants; + } + + @Override + public Tenant delete(Integer phoneNumber) { + Tenant tenant = findByPhoneNumber(phoneNumber); + if (tenant != null) { + tenants.removeIf(user1 -> user1.equals(tenant)); + return tenant; + } else return null; + } + + @Override + public Tenant insert(Tenant model) { + tenants.add(model); + return model; + } + + @Override + public Tenant delete(Tenant model) { + Tenant tenant = findByPhoneNumber(model.getPhoneNumber()); + if (tenant != null) { + tenants.remove(tenant); + } + return tenant; + } +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Administrator.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Administrator.java new file mode 100644 index 000000000..60982a8cd --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Administrator.java @@ -0,0 +1,38 @@ +package org.openjfx.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class Administrator extends Person implements Serializable { + + public static Administrator administrator = null; + private List notifications = new ArrayList<>(); + + private Administrator(String userName, Integer phoneNumber) { + super(userName, phoneNumber); + } + + public static Administrator getInstance(String userName, Integer phoneNumber) { + if (administrator == null) { + administrator = new Administrator(userName, phoneNumber); + } + return administrator; + } + + public List getNotifications() { + return notifications; + } + + public void setNotifications(List notifications) { + this.notifications = notifications; + } + + @Override + public String toString() { + return "Administrator{" + + "notifications=" + notifications + + '}'; + } +} + diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Apartment.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Apartment.java new file mode 100644 index 000000000..2d8bbe0a4 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Apartment.java @@ -0,0 +1,71 @@ +package org.openjfx.model; + +import java.util.ArrayList; +import java.util.List; + +public class Apartment { + + private int numberOfTenants; + private String city; + private String address; + private List bills = new ArrayList<>(); + private List tenants = new ArrayList<>(); + + public Apartment(int numberOfTenants, String city, String address) { + this.numberOfTenants = numberOfTenants; + this.city = city; + this.address = address; + } + + public int getNumberOfTenants() { + return numberOfTenants; + } + + public void setNumberOfTenants(int numberOfTenants) { + this.numberOfTenants = numberOfTenants; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getAddress() { + return address; + } + + public void setAddress(String adress) { + this.address = adress; + } + + public List getBills() { + return bills; + } + + public void setBills(List bills) { + this.bills = bills; + } + + public List getTenants() { + return tenants; + } + + public void setTenants(List tenants) { + this.tenants = tenants; + } + + @Override + public String toString() { + return "Apartment{" + + "numberOfTenants=" + numberOfTenants + + ", city='" + city + '\'' + + ", address='" + address + '\'' + + ", bills=" + bills + + ", tenants=" + tenants + + '}'; + } +} + diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Bill.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Bill.java new file mode 100644 index 000000000..1e4d0a9fb --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Bill.java @@ -0,0 +1,101 @@ +package org.openjfx.model; + +import java.util.Date; + +public class Bill { + private int ID; + private BillTypes name; + private Date dateOfRelease; + private String type; + private boolean status; + private Date dateOfPayment; + private int totalAmount; + + public Bill(int ID, String type, Date dateOfRelease, boolean status, int totalAmount) { + this.ID = ID; + this.type = type; + this.dateOfRelease = dateOfRelease; + this.status = status; + this.totalAmount = totalAmount; + } + + public Bill(int ID, BillTypes name, Date dateOfRelease, String type, boolean status, Date dateOfPayment, int totalAmount) { + this.ID = ID; + this.name = name; + this.dateOfRelease = dateOfRelease; + this.type = type; + this.status = status; + this.dateOfPayment = dateOfPayment; + this.totalAmount = totalAmount; + } + + public int getID() { + return ID; + } + + public void setID(int ID) { + this.ID = ID; + } + + public BillTypes getName() { + return name; + } + + public void setName(BillTypes name) { + this.name = name; + } + + public Date getDateOfRelease() { + return dateOfRelease; + } + + public void setDateOfRelease(Date dateOfRelease) { + this.dateOfRelease = dateOfRelease; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public boolean isStatus() { + return status; + } + + public void setStatus(boolean status) { + this.status = status; + } + + public Date getDateOfPayment() { + return dateOfPayment; + } + + public void setDateOfPayment(Date dateOfPayment) { + this.dateOfPayment = dateOfPayment; + } + + public int getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(int totalAmount) { + this.totalAmount = totalAmount; + } + + @Override + public String toString() { + return "Bill{" + + "ID=" + ID + + ", name=" + name + + ", dateOfRelease=" + dateOfRelease + + ", type='" + type + '\'' + + ", status=" + status + + ", dateOfPayment=" + dateOfPayment + + ", totalAmount=" + totalAmount + + '}'; + } +} + diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/BillTypes.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/BillTypes.java new file mode 100644 index 000000000..66278db47 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/BillTypes.java @@ -0,0 +1,5 @@ +package org.openjfx.model; + +public enum BillTypes { + Electricity, Gas, Administration, Internet; +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/HouseOwner.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/HouseOwner.java new file mode 100644 index 000000000..510eeeaa9 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/HouseOwner.java @@ -0,0 +1,53 @@ +package org.openjfx.model; + +public class HouseOwner extends Person { + private final Apartment apartment; + + private HouseOwner(Apartment apartment, String houseOwnerName, int houseOwnerPhoneNumber) { + super(houseOwnerName, houseOwnerPhoneNumber); + this.apartment = apartment; + } + + void addBill(Bill bill) { + apartment.getBills().add(bill); + System.out.println("Factura adaugata!"); + } + + void displayUnpaidBills() { + for (Bill bill : apartment.getBills()) { + if (!bill.isStatus()) { + System.out.println(bill); + } + } + } + + public void addTenant(Tenant tenant) { + apartment.getTenants().add(tenant); + System.out.println(tenant.getUserName() + " este noul chirias!"); + } + + void removeTenant(int phoneNumber) { + for (Tenant tenant : apartment.getTenants()) { + if (tenant.getPhoneNumber() == phoneNumber) { + System.out.println(tenant.getUserName() + " nu mai este chirias!"); + apartment.getTenants().remove(tenant); + } + } + + } + + public void displayTenants() { + for (Tenant tenant : apartment.getTenants()) { + System.out.println(tenant.toString()); + } + } + + @Override + public String toString() { + return "HouseOwner{" + + "apartment=" + apartment + + '}'; + } +} + + diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Person.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Person.java new file mode 100644 index 000000000..93843b923 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Person.java @@ -0,0 +1,38 @@ +package org.openjfx.model; + +import java.io.Serializable; + +public class Person implements Serializable { + + private String userName; + private Integer phoneNumber; + + public Person(String userName, Integer phoneNumber) { + this.userName = userName; + this.phoneNumber = phoneNumber; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Integer getPhoneNumber() { + return phoneNumber; + } + + public void setPhoneNumber(Integer phoneNumber) { + this.phoneNumber = phoneNumber; + } + + @Override + public String toString() { + return "Person{" + + "userName='" + userName + '\'' + + ", phoneNumber=" + phoneNumber + + '}'; + } +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Tenant.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Tenant.java new file mode 100644 index 000000000..6f5f87f61 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/model/Tenant.java @@ -0,0 +1,45 @@ +package org.openjfx.model; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class Tenant extends Person implements Serializable { + + private List bills = new ArrayList<>(); + private Date dateOfAccommodation; + + public Tenant(String userName, Integer phoneNumber) { + super(userName, phoneNumber); + } + + public Tenant(String userName, Integer phoneNumber, Date dateOfAccommodation) { + super(userName, phoneNumber); + this.dateOfAccommodation = dateOfAccommodation; + } + + public List getBills() { + return bills; + } + + public void setBills(List bills) { + this.bills = bills; + } + + public Date getDateOfAccommodation() { + return dateOfAccommodation; + } + + public void setDateOfAccommodation(Date dateOfAccommodation) { + this.dateOfAccommodation = dateOfAccommodation; + } + + @Override + public String toString() { + return "Tenant{" + + "bills=" + bills + + ", dateOfAccommodation=" + dateOfAccommodation + + '}'; + } +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/service/AdministratorService.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/service/AdministratorService.java new file mode 100644 index 000000000..1dca16aa4 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/service/AdministratorService.java @@ -0,0 +1,55 @@ +package org.openjfx.service; + +import org.openjfx.dao.AdministratorDao; +import org.openjfx.model.Administrator; +import org.openjfx.model.Person; +import org.openjfx.util.InitApplication; + +import java.io.IOException; +import java.util.List; + + +public class AdministratorService { + + public static AdministratorService adminService = null; + public static AdministratorDao administratorDataAccessService = new AdministratorDao(); + private String currentNotification; + + private AdministratorService(AdministratorDao administratorDataAccessService) { + AdministratorService.administratorDataAccessService = administratorDataAccessService; + } + + public static AdministratorService getInstance() { + if (adminService == null) { + adminService = new AdministratorService(administratorDataAccessService); + } + return adminService; + } + + public Person findByPhoneNumber(Integer phoneNumber) { + return administratorDataAccessService.findByPhoneNumber(phoneNumber); + } + + + public void insert(Administrator model) { + administratorDataAccessService.insert(model); + } + + public List selectAll() { + return administratorDataAccessService.selectAll(); + } + + public void notifyMe() throws IOException { + Administrator administrator = InitApplication.initAdminCredentials(); + administrator.getNotifications().add(getCurrentNotification()); + } + + public String getCurrentNotification() { + return currentNotification; + } + + public void setCurrentNotification(String currentNotification) { + this.currentNotification = currentNotification; + } + +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/service/LoginService.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/service/LoginService.java new file mode 100644 index 000000000..eb8384c43 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/service/LoginService.java @@ -0,0 +1,55 @@ +package org.openjfx.service; + +import org.openjfx.model.Person; +import org.openjfx.model.Tenant; +import org.openjfx.util.InitApplication; + +import java.io.IOException; +import java.util.List; + +public class LoginService { + + public static LoginService loginService = null; + private static final PersonService personService = PersonService.getInstance(); + private static final TenantService tenantService = TenantService.getInstance(); + private int idGrasper; + + public static LoginService getInstance() { + if (loginService == null) { + loginService = new LoginService(); + } + return loginService; + } + + public String logIn(Person formUser) throws IOException { + List tenants = tenantService.selectAll(); + tenants.addAll(InitApplication.loadTenantCredentials()); + tenants.forEach(System.out::println); + Person myUser = personService.findByPhoneNumber(formUser.getPhoneNumber()); + if (myUser == null) { + return null; + } + setIdGrasper(formUser.getPhoneNumber()); + if (myUser.equals(InitApplication.initAdminCredentials())) { + return "ADMIN"; + } + for (Tenant tenant : tenants) { + if (checkCondition(tenantService.findByPhoneNumber(tenant.getPhoneNumber()), formUser)) { + return "TENANT"; + } + } + return null; + } + + private static boolean checkCondition(Person original, Person toEvaluate) { + return original.getPhoneNumber().equals(toEvaluate.getPhoneNumber()) && original.getUserName().equals(toEvaluate.getUserName()); + } + + public void setIdGrasper(int idGrasper) { + this.idGrasper = idGrasper; + } + + public int getIdGrasper() { + return idGrasper; + } +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/service/PersonService.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/service/PersonService.java new file mode 100644 index 000000000..004b0122c --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/service/PersonService.java @@ -0,0 +1,41 @@ +package org.openjfx.service; + + +import org.openjfx.dao.PersonDao; +import org.openjfx.model.Person; +import org.openjfx.model.Tenant; + +import java.util.List; + +public class PersonService { + + private static PersonService userService = null; + public static PersonDao userDataAccessService = new PersonDao(); + + private PersonService(PersonDao userDataAccessService) { + PersonService.userDataAccessService = userDataAccessService; + } + + public static PersonService getInstance() { + if (userService == null) { + userService = new PersonService(userDataAccessService); + } + return userService; + } + + public Person findByPhoneNumber(Integer phoneNumber) { + return userDataAccessService.findByPhoneNumber(phoneNumber); + } + + public void insert(Person model) { + userDataAccessService.insert(model); + } + + public List selectAll() { + return userDataAccessService.selectAll(); + } + + public Person delete(Person model) { + return userDataAccessService.delete(model); + } +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/service/TenantService.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/service/TenantService.java new file mode 100644 index 000000000..b193b06d2 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/service/TenantService.java @@ -0,0 +1,52 @@ +package org.openjfx.service; + +import org.openjfx.dao.TenantDao; +import org.openjfx.model.Bill; +import org.openjfx.model.Tenant; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.List; + +public class TenantService { + + private static TenantService tenantService = null; + public static TenantDao tenantDataAccessService = new TenantDao(); + + public TenantService(TenantDao tenantDataAccessService) { + TenantService.tenantDataAccessService = tenantDataAccessService; + } + + public static TenantService getInstance() { + if (tenantService == null) { + tenantService = new TenantService(tenantDataAccessService); + } + return tenantService; + } + + public void insert(Tenant model) { + tenantDataAccessService.insert(model); + } + + public List selectAll() { + return tenantDataAccessService.selectAll(); + } + + public void delete(Tenant model) { + tenantDataAccessService.delete(model); + } + + public Tenant findByPhoneNumber(Integer phoneNumber) { + return tenantDataAccessService.findByPhoneNumber(phoneNumber); + } + + public void notifyMe(String sum, Tenant tenant, String billType) { + DateTimeFormatter myFormatObj = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss"); + LocalDateTime dateAndTime = LocalDateTime.now(); + String stringDateTime = myFormatObj.format(dateAndTime); + Bill bill = new Bill(tenant.getBills().size() + 1, billType, Date.from(Instant.now()), false, Integer.parseInt(sum)); + tenant.getBills().add(bill); + } +} diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/util/InitApplication.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/util/InitApplication.java new file mode 100644 index 000000000..687a5c56c --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/org/openjfx/util/InitApplication.java @@ -0,0 +1,92 @@ +package org.openjfx.util; + +import org.openjfx.model.Administrator; +import org.openjfx.model.Tenant; +import org.openjfx.service.PersonService; +import org.openjfx.service.TenantService; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +public class InitApplication { + + private static final File personsFile = new File("persons.txt"); + private static final PersonService personService = PersonService.getInstance(); + + public static Administrator initAdminCredentials() throws IOException { + File file = new File("adminCredentials"); + String name = null; + int phoneNumber = 0; + try { + BufferedReader br = new BufferedReader(new FileReader(file)); + name = br.readLine(); + phoneNumber = Integer.parseInt(br.readLine()); + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + personService.insert(Administrator.getInstance(name, phoneNumber)); + FileOutputStream fileOutputStream = new FileOutputStream(personsFile); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); + objectOutputStream.writeObject(personService.selectAll().get(0)); + fileOutputStream.close(); + return Administrator.getInstance(name, phoneNumber); + } + + public static void deserializeInitialTenants() throws IOException { + + FileInputStream fileInputStream = new FileInputStream("persons.txt"); + ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); + List tenants = new ArrayList<>(); + TenantService tenantService = TenantService.getInstance(); + while (true) { + try { + tenants.add((Tenant) objectInputStream.readObject()); + } catch (Exception e) { + break; + } + } + objectInputStream.close(); + fileInputStream.close(); + for (Tenant tenant : tenants) { + tenantService.insert(tenant); + } + } + + public static List loadTenantCredentials() { + File file = new File("tenantCredentials"); + List tenants = new ArrayList<>(); + String line; + String name; + int phoneNumber; + try { + BufferedReader br = new BufferedReader(new FileReader(file)); + while ((line = br.readLine()) != null) { + String[] arguments = line.split(" "); + name = arguments[0]; + phoneNumber = Integer.parseInt(arguments[1]); + tenants.add(new Tenant(name, phoneNumber)); + personService.insert(new Tenant(name, phoneNumber)); + } + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + tenants.forEach(System.out::println); + return tenants; + } + + public static void serializeTenantsAfterSomeOperations() throws IOException { + TenantService tenantService = TenantService.getInstance(); + List tenants = tenantService.selectAll(); + File f = new File("persons.txt"); + FileOutputStream fileOutputStream = new FileOutputStream(f); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); + for (Tenant tenant : tenants) { + objectOutputStream.writeObject(tenant); + } + fileOutputStream.close(); + } +} + diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/resources/org/openjfx/administrator.fxml b/clean_code_projects/_2_project_requirements_design_patterns/src/main/resources/org/openjfx/administrator.fxml new file mode 100644 index 000000000..04435ecf9 --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/resources/org/openjfx/administrator.fxml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/resources/org/openjfx/paidBills.fxml b/clean_code_projects/_2_project_requirements_design_patterns/src/main/resources/org/openjfx/paidBills.fxml new file mode 100644 index 000000000..c51d224ee --- /dev/null +++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/resources/org/openjfx/paidBills.fxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + +