diff --git a/_1_basics/src/main/java/code/_3_in_class/BunaZiua.java b/_1_basics/src/main/java/code/_3_in_class/BunaZiua.java
new file mode 100644
index 000000000..838a1af47
--- /dev/null
+++ b/_1_basics/src/main/java/code/_3_in_class/BunaZiua.java
@@ -0,0 +1,8 @@
+package code._3_in_class;
+
+public class BunaZiua {
+
+ public static void main(String[] args) { // COMMAND : psvm
+ System.out.println("buna");
+ }
+}
diff --git a/_2_oo/src/main/java/code/_3_in_class/Boxer.java b/_2_oo/src/main/java/code/_3_in_class/Boxer.java
new file mode 100644
index 000000000..0592c781f
--- /dev/null
+++ b/_2_oo/src/main/java/code/_3_in_class/Boxer.java
@@ -0,0 +1,33 @@
+package code._3_in_class;
+
+import java.util.Random;
+
+public class Boxer implements IBoxer {
+
+ String name;
+ int health=100;
+ int damagePerAttack=10;
+
+
+ public Boxer(String name, int health, int damagePerAttack) {
+ this.name = name;
+ this.health = health;
+ this.damagePerAttack = damagePerAttack;
+ }
+
+ public Boxer(String name) {
+ this.name = name;
+ }
+
+ public void attack(Boxer opponent){
+ int defend = (this.damagePerAttack * this.defend())/100;
+ opponent.health = opponent.health - (this.damagePerAttack - defend);
+ System.out.println(this.name + " il ataca pe " + opponent.name + '\n' +
+ this.name + " health = " + this.health + " " + opponent.name + " health = " + opponent.health );
+ }
+
+ public int defend() {
+ Random ran = new Random();
+ return ran.nextInt(101);
+ }
+}
diff --git a/_2_oo/src/main/java/code/_3_in_class/BruceLee.java b/_2_oo/src/main/java/code/_3_in_class/BruceLee.java
new file mode 100644
index 000000000..c7fecf477
--- /dev/null
+++ b/_2_oo/src/main/java/code/_3_in_class/BruceLee.java
@@ -0,0 +1,18 @@
+package code._3_in_class;
+
+public class BruceLee extends Boxer {
+
+ public BruceLee(String name, int health, int damagePerAttack){
+ super(name,health,damagePerAttack);
+ }
+
+ public BruceLee(String name){
+ super(name);
+ }
+
+ public void attack(Boxer opponent) {
+ opponent.health = 0;
+ System.out.println(this.name + " il ataca pe " + opponent.name + '\n' +
+ this.name + " health = " + this.health + " " + opponent.name + " health = " + opponent.health );
+ }
+}
diff --git a/_2_oo/src/main/java/code/_3_in_class/IBoxer.java b/_2_oo/src/main/java/code/_3_in_class/IBoxer.java
new file mode 100644
index 000000000..0e55594a6
--- /dev/null
+++ b/_2_oo/src/main/java/code/_3_in_class/IBoxer.java
@@ -0,0 +1,6 @@
+package code._3_in_class;
+
+public interface IBoxer {
+ void attack(Boxer opponent);
+ int defend();
+}
diff --git a/_2_oo/src/main/java/code/_3_in_class/Main.java b/_2_oo/src/main/java/code/_3_in_class/Main.java
index 3b87b4563..92d6012cb 100644
--- a/_2_oo/src/main/java/code/_3_in_class/Main.java
+++ b/_2_oo/src/main/java/code/_3_in_class/Main.java
@@ -1,8 +1,36 @@
package code._3_in_class;
+import javax.swing.*;
+import java.util.Random;
public class Main {
public static void main(String[] args) {
//TODO put your code changes in here
+ Boxer Ion = new Boxer("Ion",100,14);
+ Boxer Vasile = new Boxer("Vasile",100,10);
+ Boxer bruceLee = new BruceLee("Bruce Lee");
+ startBoxingMatch(Ion,bruceLee);
+ //startBoxingMatch(Ion,Vasile);
+ announceVictory(Ion,bruceLee);
+ }
+
+ private static void announceVictory(Boxer b1, Boxer b2){
+ if(b1.health <= 0)
+ System.out.println(b2.name + " a castigat.");
+ else
+ System.out.println(b1.name + " a castigat.");
+
}
+
+ private static void startBoxingMatch(Boxer b1, Boxer b2) {
+ Random ran = new Random();
+ int zeroOrOne = ran.nextInt(100);
+ while (b1.health > 0 && b2.health > 0) {
+ if (zeroOrOne % 2 == 0)
+ b1.attack(b2);
+ else
+ b2.attack(b1);
+ }
+ }
+
}
\ No newline at end of file
diff --git a/_3_design_patterns/src/main/java/code/_3_in_class/StaticExample.java b/_3_design_patterns/src/main/java/code/_3_in_class/StaticExample.java
new file mode 100644
index 000000000..d2592668d
--- /dev/null
+++ b/_3_design_patterns/src/main/java/code/_3_in_class/StaticExample.java
@@ -0,0 +1,31 @@
+package code._3_in_class;
+
+public class StaticExample {
+ static final int altaVariabila = 0; // will postpone for now
+ static int iStaticSauVariabilaDeClasa = 0; // keyword static -> ne lasa posibilitatea de schimbarea unei variabile
+ int iInstantaSauVariabilaDeInstanta = 0;
+
+ public static void main(String[] args) {
+ StaticExample i1 = new StaticExample();
+ StaticExample i2 = new StaticExample();
+ StaticExample i3 = new StaticExample();
+
+ i1.iStaticSauVariabilaDeClasa = 1;
+ i2.iInstantaSauVariabilaDeInstanta = 2;
+ i3.iInstantaSauVariabilaDeInstanta = 3;
+ System.out.println("i1.iStatic =" + i1.iInstantaSauVariabilaDeInstanta);
+ System.out.println("i2.iInstanta =" + i2.iInstantaSauVariabilaDeInstanta);
+ System.out.println("i3.iInstanta=" + i3.iInstantaSauVariabilaDeInstanta);
+
+ }
+
+ static void m() {
+ System.out.println("static method");
+ }
+
+ void m2() {
+ System.out.println("m2");
+ }
+
+
+ }
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..792e3b895 100644
--- a/clean_code_projects/_2_project_requirements_design_patterns/pom.xml
+++ b/clean_code_projects/_2_project_requirements_design_patterns/pom.xml
@@ -10,6 +10,18 @@
4.0.0
_2_design_patterns_project
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 16
+ 16
+
+
+
+
\ No newline at end of file
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/DoctorRepository/CollectionIterator.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/DoctorRepository/CollectionIterator.java
new file mode 100644
index 000000000..24b72ab9c
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/DoctorRepository/CollectionIterator.java
@@ -0,0 +1,39 @@
+package clean.code.design_patterns.requirements.DoctorRepository;
+
+import clean.code.design_patterns.requirements.Domain.Doctor;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+
+public class CollectionIterator implements ICollectionIterator {
+ private List list;
+ private int position;
+
+ public CollectionIterator(List list) {
+ this.list = list;
+ this.position = 0;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return position < list.size();
+ }
+
+ @Override
+ public Doctor next() {
+ if (hasNext()) {
+ Doctor nextDoctor = list.get(position);
+ position++;
+ return nextDoctor;
+ }
+ throw new NoSuchElementException("No more elements in the collection.");
+ }
+
+ @Override
+ public Doctor currentPosition() {
+ if (position >= 0 && position < list.size()) {
+ return list.get(position);
+ }
+ throw new IllegalStateException("Iterator is not pointing to a valid position.");
+ }
+}
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/DoctorRepository/DoctorRepository.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/DoctorRepository/DoctorRepository.java
new file mode 100644
index 000000000..de8c1fe35
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/DoctorRepository/DoctorRepository.java
@@ -0,0 +1,31 @@
+package clean.code.design_patterns.requirements.DoctorRepository;
+import java.util.ArrayList;
+import java.util.List;
+import clean.code.design_patterns.requirements.Domain.Doctor;
+
+public class DoctorRepository implements ICollection {
+ private List repo;
+
+ public DoctorRepository() {
+ this.repo = new ArrayList<>();
+ }
+
+ @Override
+ public void add(Doctor doctor) {
+ this.repo.add(doctor);
+ }
+
+ @Override
+ public void remove(Doctor doctor) {
+ this.repo.remove(doctor);
+ }
+
+ @Override
+ public ICollectionIterator iterator() {
+ return new CollectionIterator(this.repo);
+ }
+
+ public List getAll() {
+ return this.repo;
+ }
+}
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/DoctorRepository/ICollection.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/DoctorRepository/ICollection.java
new file mode 100644
index 000000000..0ba96f7f6
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/DoctorRepository/ICollection.java
@@ -0,0 +1,8 @@
+package clean.code.design_patterns.requirements.DoctorRepository;
+import clean.code.design_patterns.requirements.Domain.Doctor;
+
+public interface ICollection {
+ void add(Doctor doctor);
+ void remove(Doctor doctor);
+ ICollectionIterator iterator();
+}
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/DoctorRepository/ICollectionIterator.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/DoctorRepository/ICollectionIterator.java
new file mode 100644
index 000000000..7731e5d18
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/DoctorRepository/ICollectionIterator.java
@@ -0,0 +1,10 @@
+package clean.code.design_patterns.requirements.DoctorRepository;
+
+
+import clean.code.design_patterns.requirements.Domain.Doctor;
+
+public interface ICollectionIterator {
+ boolean hasNext();
+ Doctor next();
+ Doctor currentPosition();
+}
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Domain/Doctor.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Domain/Doctor.java
new file mode 100644
index 000000000..5010e01e9
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Domain/Doctor.java
@@ -0,0 +1,66 @@
+package clean.code.design_patterns.requirements.Domain;
+import java.util.Objects;
+
+public class Doctor {
+ private String firstName;
+ private String lastName;
+ private String specialization;
+ private double salary;
+
+ public Doctor(String firstName, String lastName, String specialization, double salary) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.specialization = specialization;
+ this.salary = salary;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getSpecialization() {
+ return specialization;
+ }
+
+ public void setSpecialization(String specialization) {
+ this.specialization = specialization;
+ }
+
+ public double getSalary() {
+ return salary;
+ }
+
+ public void setSalary(double salary) {
+ this.salary = salary;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Doctor doctor = (Doctor) o;
+ return Objects.equals(firstName, doctor.firstName) && Objects.equals(lastName, doctor.lastName) && Objects.equals(specialization, doctor.specialization) && Objects.equals(salary, doctor.salary);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(firstName, lastName, specialization, salary);
+ }
+
+ @Override
+ public String toString() {
+ return "Dr. " + firstName + ' ' + lastName + ", " + specialization + ", has salary " + salary + "$";
+ }
+}
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Main.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Main.java
index 8a9fccb7b..10f58240d 100644
--- a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Main.java
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Main.java
@@ -1,8 +1,16 @@
package clean.code.design_patterns.requirements;
+import clean.code.design_patterns.requirements.DoctorRepository.DoctorRepository;
+import clean.code.design_patterns.requirements.Service.Service;
+import clean.code.design_patterns.requirements.UI.UserInterface;
+import clean.code.design_patterns.requirements.Validate.Validator;
public class Main {
-
public static void main(String[] args) {
- //TODO implement your design patterns in this package
+
+ DoctorRepository repo = new DoctorRepository();
+ Validator validator = new Validator();
+ Service service = new Service(repo,validator);
+ UserInterface ui = new UserInterface(service);
+ ui.start();
}
-}
+}
\ No newline at end of file
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Service/Service.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Service/Service.java
new file mode 100644
index 000000000..eab22089d
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Service/Service.java
@@ -0,0 +1,99 @@
+package clean.code.design_patterns.requirements.Service;
+import clean.code.design_patterns.requirements.DoctorRepository.DoctorRepository;
+import clean.code.design_patterns.requirements.DoctorRepository.ICollectionIterator;
+import clean.code.design_patterns.requirements.Domain.Doctor;
+import clean.code.design_patterns.requirements.SortingStrategy.ISortingStrategy;
+import clean.code.design_patterns.requirements.Validate.Validator;
+
+import java.util.List;
+import java.util.Objects;
+
+
+public class Service {
+ private DoctorRepository repo;
+ private Validator validator;
+
+ public Service(DoctorRepository repo, Validator validator) {
+ this.repo = repo;
+ this.validator = validator;
+ }
+
+ public void addDoctor(String firstName, String lastName, String specialization, double salary) {
+ Doctor doctor = new Doctor(firstName, lastName, specialization, salary);
+ validator.validate(doctor);
+ repo.add(doctor);
+ }
+
+ public void deleteDoctor(String firstName, String lastName) {
+ ICollectionIterator iterator = repo.iterator();
+ while (iterator.hasNext()) {
+ Doctor doctor = iterator.next();
+ if (doctor.getFirstName().equals(firstName) && doctor.getLastName().equals(lastName)) {
+ repo.remove(doctor);
+ break; // Exit the loop after removing the doctor
+ }
+ }
+ }
+
+ public void salaryUpdate(String firstName, String lastName, String specialization, double newSalary) {
+ Doctor doctor = new Doctor(firstName, lastName, specialization, newSalary);
+ validator.validate(doctor);
+ ICollectionIterator iterator = repo.iterator();
+ while (iterator.hasNext()) {
+ Doctor currentDoctor = iterator.currentPosition();
+ if (currentDoctor.getFirstName().equals(firstName) && currentDoctor.getLastName().equals(lastName) && Objects.equals(currentDoctor.getSpecialization(), specialization)) {
+ currentDoctor.setSalary(newSalary);
+ }
+ iterator.next();
+ }
+ }
+
+ public void specializationUpdate(String firstName, String lastName, String newSpecialization) {
+ ICollectionIterator iterator = repo.iterator();
+ while (iterator.hasNext()) {
+ Doctor doctor = iterator.currentPosition();
+ if (doctor.getFirstName().equals(firstName) && doctor.getLastName().equals(lastName)) {
+ Doctor updatedDoctor = new Doctor(firstName, lastName, newSpecialization, doctor.getSalary());
+ validator.validate(updatedDoctor);
+ doctor.setSpecialization(newSpecialization);
+ }
+ iterator.next();
+ }
+ }
+
+ public void updateSpecializationAndSalary(String firstName, String lastName, String newSpecialization, double newSalary) {
+ ICollectionIterator iterator = repo.iterator();
+ while (iterator.hasNext()) {
+ Doctor doctor = iterator.currentPosition();
+ if (doctor.getFirstName().equals(firstName) && doctor.getLastName().equals(lastName)) {
+ Doctor updatedDoctor = new Doctor(firstName, lastName, newSpecialization, newSalary);
+ validator.validate(updatedDoctor);
+ doctor.setSpecialization(newSpecialization);
+ doctor.setSalary(newSalary);
+ }
+ iterator.next();
+ }
+ }
+
+ public List filterBySpecialization(String specialization) {
+ return repo.getAll()
+ .stream()
+ .filter(doctor -> doctor.getSpecialization().equals(specialization))
+ .toList();
+ }
+
+ public List filterByName(String firstName, String lastName) {
+ return repo.getAll()
+ .stream()
+ .filter(doctor -> doctor.getFirstName().equals(firstName) && doctor.getLastName().equals(lastName))
+ .toList();
+ }
+
+ public List sortList(ISortingStrategy strategy) {
+ return strategy.sort(repo.getAll());
+ }
+
+ public ICollectionIterator getIterator() {
+ return repo.iterator();
+ }
+}
\ No newline at end of file
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/SortingStrategy/ISortingStrategy.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/SortingStrategy/ISortingStrategy.java
new file mode 100644
index 000000000..ad092cf8e
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/SortingStrategy/ISortingStrategy.java
@@ -0,0 +1,9 @@
+package clean.code.design_patterns.requirements.SortingStrategy;
+
+import clean.code.design_patterns.requirements.Domain.Doctor;
+
+import java.util.List;
+
+public interface ISortingStrategy {
+ List sort(List list);
+}
\ No newline at end of file
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/SortingStrategy/SortByName.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/SortingStrategy/SortByName.java
new file mode 100644
index 000000000..fa9419838
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/SortingStrategy/SortByName.java
@@ -0,0 +1,15 @@
+package clean.code.design_patterns.requirements.SortingStrategy;
+import clean.code.design_patterns.requirements.Domain.Doctor;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SortByName implements ISortingStrategy {
+ @Override
+ public List sort(List list) {
+ return list.stream()
+ .sorted(Comparator.comparing(Doctor::getFirstName).thenComparing(Doctor::getLastName))
+ .collect(Collectors.toList());
+ }
+}
\ No newline at end of file
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/SortingStrategy/SortBySalary.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/SortingStrategy/SortBySalary.java
new file mode 100644
index 000000000..02e3e3f87
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/SortingStrategy/SortBySalary.java
@@ -0,0 +1,15 @@
+package clean.code.design_patterns.requirements.SortingStrategy;
+import clean.code.design_patterns.requirements.Domain.Doctor;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SortBySalary implements ISortingStrategy {
+ @Override
+ public List sort(List list) {
+ return list.stream()
+ .sorted(Comparator.comparingDouble(Doctor::getSalary).reversed())
+ .collect(Collectors.toList());
+ }
+}
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/SortingStrategy/SortBySpecialization.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/SortingStrategy/SortBySpecialization.java
new file mode 100644
index 000000000..84be56c3e
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/SortingStrategy/SortBySpecialization.java
@@ -0,0 +1,17 @@
+package clean.code.design_patterns.requirements.SortingStrategy;
+
+
+import clean.code.design_patterns.requirements.Domain.Doctor;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SortBySpecialization implements ISortingStrategy {
+ @Override
+ public List sort(List list) {
+ return list.stream()
+ .sorted(Comparator.comparing(Doctor::getSpecialization))
+ .collect(Collectors.toList());
+ }
+}
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/UI/UserInterface.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/UI/UserInterface.java
new file mode 100644
index 000000000..b865e9d18
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/UI/UserInterface.java
@@ -0,0 +1,230 @@
+package clean.code.design_patterns.requirements.UI;
+import clean.code.design_patterns.requirements.DoctorRepository.ICollectionIterator;
+import clean.code.design_patterns.requirements.Domain.Doctor;
+import clean.code.design_patterns.requirements.Service.Service;
+import clean.code.design_patterns.requirements.SortingStrategy.SortByName;
+import clean.code.design_patterns.requirements.SortingStrategy.SortBySalary;
+import clean.code.design_patterns.requirements.SortingStrategy.SortBySpecialization;
+import clean.code.design_patterns.requirements.Validate.ValidationException;
+
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+public class UserInterface {
+ private final Service service;
+ private final Scanner scanner;
+
+ public UserInterface(Service service) {
+ this.service = service;
+ this.scanner = new Scanner(System.in);
+ }
+
+ private void options(){
+
+ System.out.println("1. Add doctor.");
+ System.out.println("2. Delete doctor.");
+ System.out.println("3. Update doctor's specialization.");
+ System.out.println("4. Update doctor's salary");
+ System.out.println("5. Update doctor's specialization and salary.");
+ System.out.println("6. Display doctors.");
+ System.out.println("7. Search for a doctor.");
+ System.out.println("8. Filter doctors by specialization.");
+ System.out.println("9. Sort doctors by name.");
+ System.out.println("10. Sort doctors by specialization.");
+ System.out.println("11. Sort doctors by salary.");
+ System.out.println("x. Exit");
+ }
+
+ public void start(){
+ this.service.addDoctor("John","Doe","Cardiologist",4000.0);
+ this.service.addDoctor("Michael","Smith","Dermatologist",3000.0);
+ this.service.addDoctor("Sarah","Johnson","Pediatrician",4000.0);
+ this.service.addDoctor("Emily","Brown","Cardiologist",4500.0);
+ this.service.addDoctor("Daniel","Miller","Orthopedic",5000.0);
+ this.service.addDoctor("Olivia","Taylor","Neurologist",6000.0);
+ this.service.addDoctor("David","Anderson","Orthopedic",10000.0);
+ this.service.addDoctor("Emma","Wilson","Cardiologist",11000.0);
+ this.service.addDoctor("James","Clark","Dermatologist",9500.0);
+ this.service.addDoctor("Oliver","Hill","Orthopedic",3700.0);
+ this.service.addDoctor("Sophia","Baker","Neurologist",4100.0);
+
+ String option;
+ options();
+ while (true){
+
+ System.out.println("Enter your choice: ");
+ option = scanner.nextLine();
+ switch (option){
+ case "1" -> addDoctor();
+ case "2" -> deleteDoctor();
+ case "3" -> updateSpecialization();
+ case "4" -> updateSalary();
+ case "5" -> updateSpecializationSalary();
+ case "6" -> displayDoctors();
+ case "7" -> searchDoctor();
+ case "8" -> filterBySpecialization();
+ case "9" -> sortByName();
+ case "10" -> sortBySpecialization();
+ case "11" -> sortBySalary();
+ case "x" -> {
+ return;
+ }
+ default -> System.out.println("Wrong option! Try again!");
+ }
+ }
+ }
+
+ private void sortBySalary() {
+ try {
+ List list = this.service.sortList(new SortBySalary());
+ Stream stream = list.stream().map((doctor) -> {return ""+doctor.getFirstName()+" "+doctor.getLastName()+" "+doctor.getSalary();});
+ stream.forEach(System.out::println);
+ System.out.println();
+ } catch (ValidationException | IllegalArgumentException e) {
+ System.out.println(e);
+ }
+ }
+
+ private void sortBySpecialization() {
+ try {
+ List list = this.service.sortList(new SortBySpecialization());
+ Stream stream = list.stream().map((doctor) -> {
+ return "" + doctor.getFirstName() + " " + doctor.getLastName() + " " + doctor.getSpecialization();
+ });
+ stream.forEach(System.out::println);
+ System.out.println();
+ } catch (ValidationException | IllegalArgumentException e) {
+ System.out.println(e);
+ }
+ }
+
+ private void sortByName() {
+ try {
+ List list = this.service.sortList(new SortByName());
+ Stream stream = list.stream().map((doctor) -> {
+ return "" + doctor.getFirstName() + " " + doctor.getLastName();
+ });
+ stream.forEach(System.out::println);
+ System.out.println();
+ } catch (ValidationException | IllegalArgumentException e) {
+ System.out.println(e);
+ }
+ }
+
+ private void filterBySpecialization() {
+ try {
+ String specialization;
+ System.out.println("Specialization: ");
+ specialization = scanner.nextLine();
+ List list = this.service.filterBySpecialization(specialization);
+ list.forEach(System.out::println);
+ } catch (ValidationException | IllegalArgumentException e) {
+ System.out.println(e);
+ }
+ }
+
+ private void searchDoctor() {
+ try {
+ String firstName, lastName;
+ System.out.println("First name: ");
+ firstName = scanner.nextLine();
+ System.out.println("Last name: ");
+ lastName = scanner.nextLine();
+ List list = this.service.filterByName(firstName, lastName);
+ list.forEach(System.out::println);
+ } catch (ValidationException | IllegalArgumentException e) {
+ System.out.println(e);
+ }
+ }
+
+ private void displayDoctors() {
+ ICollectionIterator iterator = this.service.getIterator();
+ while (iterator.hasNext()) {
+ System.out.println(iterator.next());
+ }
+ }
+
+ private void updateSpecializationSalary() {
+ try {
+ String firstName, lastName, newSpecialization;
+ String newSalary;
+ System.out.println("First name: ");
+ firstName = scanner.nextLine();
+ System.out.println("Last name: ");
+ lastName = scanner.nextLine();
+ System.out.println("New specialization: ");
+ newSpecialization = scanner.nextLine();
+ System.out.println("New salary: ");
+ newSalary = scanner.nextLine();
+ this.service.updateSpecializationAndSalary(firstName, lastName, newSpecialization, Double.parseDouble(newSalary));
+ } catch (ValidationException | IllegalArgumentException e) {
+ System.out.println(e);
+ }
+ }
+
+ private void updateSalary() {
+ try {
+ String firstName, lastName, specialization;
+ String newSalary;
+ System.out.println("First name: ");
+ firstName = scanner.nextLine();
+ System.out.println("Last name: ");
+ lastName = scanner.nextLine();
+ System.out.println("Specialization: ");
+ specialization = scanner.nextLine();
+ System.out.println("New salary: ");
+ newSalary = scanner.nextLine();
+ this.service.salaryUpdate(firstName, lastName, specialization, Double.parseDouble(newSalary));
+ } catch (ValidationException | IllegalArgumentException e) {
+ System.out.println(e);
+ }
+ }
+
+ private void updateSpecialization() {
+ try {
+ String firstName, lastName, newSpecialization;
+ System.out.println("First name: ");
+ firstName = scanner.nextLine();
+ System.out.println("Last name: ");
+ lastName = scanner.nextLine();
+ System.out.println("New specialization: ");
+ newSpecialization = scanner.nextLine();
+ this.service.specializationUpdate(firstName, lastName, newSpecialization);
+ } catch (ValidationException | IllegalArgumentException e) {
+ System.out.println(e);
+ }
+ }
+
+ private void deleteDoctor() {
+ try {
+ String firstName, lastName;
+ System.out.println("First name: ");
+ firstName = scanner.nextLine();
+ System.out.println("Last name: ");
+ lastName = scanner.nextLine();
+ this.service.deleteDoctor(firstName, lastName);
+ } catch (ValidationException | IllegalArgumentException e) {
+ System.out.println(e);
+ }
+ }
+
+ private void addDoctor() {
+ try {
+ String firstName, lastName, specialization;
+ String salary;
+ System.out.println("First name: ");
+ firstName = scanner.nextLine();
+ System.out.println("Last name: ");
+ lastName = scanner.nextLine();
+ System.out.println("Specialization: ");
+ specialization = scanner.nextLine();
+ System.out.println("Salary: ");
+ salary = scanner.nextLine();
+ this.service.addDoctor(firstName, lastName, specialization, Double.parseDouble(salary));
+ } catch (ValidationException | IllegalArgumentException e) {
+ System.out.println(e);
+ }
+ }
+}
+
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Validate/IValidator.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Validate/IValidator.java
new file mode 100644
index 000000000..1994583e9
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Validate/IValidator.java
@@ -0,0 +1,8 @@
+package clean.code.design_patterns.requirements.Validate;
+
+
+import clean.code.design_patterns.requirements.Domain.Doctor;
+
+public interface IValidator {
+ void validate(Doctor doctor) throws ValidationException;
+}
\ No newline at end of file
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Validate/ValidationException.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Validate/ValidationException.java
new file mode 100644
index 000000000..595c0b652
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Validate/ValidationException.java
@@ -0,0 +1,16 @@
+package clean.code.design_patterns.requirements.Validate;
+
+public class ValidationException extends RuntimeException{
+ public ValidationException(String message){super(message);}
+ public ValidationException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public ValidationException(Throwable cause) {
+ super(cause);
+ }
+
+ public ValidationException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+}
diff --git a/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Validate/Validator.java b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Validate/Validator.java
new file mode 100644
index 000000000..257b4c083
--- /dev/null
+++ b/clean_code_projects/_2_project_requirements_design_patterns/src/main/java/clean/code/design_patterns/requirements/Validate/Validator.java
@@ -0,0 +1,37 @@
+package clean.code.design_patterns.requirements.Validate;
+
+import clean.code.design_patterns.requirements.Domain.Doctor;
+
+public class Validator implements IValidator {
+ @Override
+ public void validate(Doctor doctor) throws ValidationException {
+ validateFirstName(doctor.getFirstName());
+ validateLastName(doctor.getLastName());
+ validateSpecialization(doctor.getSpecialization());
+ validateSalary(doctor.getSalary());
+ }
+
+ private void validateSalary(double salary) {
+ if (salary <= 0.0) {
+ throw new ValidationException("The salary cannot be negative!");
+ }
+ }
+
+ private void validateSpecialization(String specialization) {
+ if (specialization == null || specialization.isEmpty()) {
+ throw new ValidationException("Please enter a specialization!");
+ }
+ }
+
+ private void validateLastName(String lastName) {
+ if (lastName == null || lastName.isEmpty()) {
+ throw new ValidationException("Please enter a last name!");
+ }
+ }
+
+ private void validateFirstName(String firstName) {
+ if (firstName == null || firstName.isEmpty()) {
+ throw new ValidationException("Please enter a first name!");
+ }
+ }
+}
\ No newline at end of file