commit 3479d5dcee3b1fd13a11bd14c8d52621d94816d0 Author: Namu Date: Tue Sep 23 13:14:23 2025 +0200 first commit diff --git a/.gitea/workflows/sonar.yml b/.gitea/workflows/sonar.yml new file mode 100644 index 0000000..436073c --- /dev/null +++ b/.gitea/workflows/sonar.yml @@ -0,0 +1,32 @@ +name: SonarQube Scan + +on: + push: + branches: + - '**' + pull_request: + branches: + - '**' + +jobs: + sonarqube: + name: SonarQube Trigger + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Download SonarQube Scanner + run: | + curl -sSLo sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-5.0.1.3006-linux.zip + unzip sonar-scanner.zip + + - name: Run SonarQube Scan + run: | + ./sonar-scanner-*/bin/sonar-scanner \ + -Dsonar.projectKey=tp1-iaavancee \ + -Dsonar.sources=. \ + -Dsonar.host.url=${{ secrets.SONARQUBE_HOST }} \ + -Dsonar.login=${{ secrets.SONARQUBE_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/src/Application.java b/src/Application.java new file mode 100644 index 0000000..1d93be3 --- /dev/null +++ b/src/Application.java @@ -0,0 +1,31 @@ +import entities.User; +import utils.*; + +import java.util.Arrays; + +import static utils.NotificationType.*; + +public class Application { + private final NotificationManager notificationManager; + + public Application(NotificationManager notificationManager) { + this.notificationManager = notificationManager; + } + + public void run() { + NotificationType[] typesThomas = {Sms, Mail, Push}; + NotificationType[] typesAlexandre = {Sms, Mail}; + + SendNotificationStrategy secured = new SecureSendNotificationStrategy(123); + DifferedSendNotificationStrategy differed = new DifferedSendNotificationStrategy(300); + + var thomas = new User(0, "Thomas", Arrays.asList(typesThomas), secured); + var alexandre = new User(1, "Alexandre", Arrays.asList(typesAlexandre), differed); + + notificationManager.getObservable().addSubscribers(thomas); + notificationManager.getObservable().addSubscribers(alexandre); + + notificationManager.getObservable().sendNotifications("C# > Java (mais Rust c'est le goat)"); + + } +} diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..c68906d --- /dev/null +++ b/src/Main.java @@ -0,0 +1,8 @@ +import utils.NotificationManager; + +void main(String[] args) { + final var notificationManager = NotificationManager.getInstance(); + final var app = new Application(notificationManager); + + app.run(); +} diff --git a/src/entities/MailNotification.java b/src/entities/MailNotification.java new file mode 100644 index 0000000..d6b314d --- /dev/null +++ b/src/entities/MailNotification.java @@ -0,0 +1,16 @@ +package entities; + +import utils.SendNotificationStrategy; + +public class MailNotification extends Notification { + public MailNotification(String content, User user, SendNotificationStrategy strategy) { + super(content, user, strategy); + } + + @Override + public void send() { + if (isSendable()) + strategy.send(user.id() + " Mail: " + user.name() + " " + content); + } + +} diff --git a/src/entities/Notification.java b/src/entities/Notification.java new file mode 100644 index 0000000..0248e64 --- /dev/null +++ b/src/entities/Notification.java @@ -0,0 +1,24 @@ +package entities; + +import utils.NotificationState; +import utils.SendNotificationStrategy; + +public abstract class Notification { + protected String content; + protected User user; + protected NotificationState state; + protected SendNotificationStrategy strategy; + + public Notification(String content, User user, SendNotificationStrategy strategy) { + this.content = content; + this.user = user; + this.state = NotificationState.PENDING; + this.strategy = strategy; + } + + protected boolean isSendable() { + return this.state != NotificationState.SENT && this.state != NotificationState.READ; + } + + public abstract void send(); +} diff --git a/src/entities/PushNotification.java b/src/entities/PushNotification.java new file mode 100644 index 0000000..dd2201e --- /dev/null +++ b/src/entities/PushNotification.java @@ -0,0 +1,15 @@ +package entities; + +import utils.SendNotificationStrategy; + +public class PushNotification extends Notification { + public PushNotification(String content, User user, SendNotificationStrategy strategy) { + super(content, user, strategy); + } + + @Override + public void send() { + if (isSendable()) + strategy.send(user.id() + " Push: " + user.name() + " " + content); + } +} diff --git a/src/entities/SmsNotification.java b/src/entities/SmsNotification.java new file mode 100644 index 0000000..6b85817 --- /dev/null +++ b/src/entities/SmsNotification.java @@ -0,0 +1,16 @@ +package entities; + +import utils.SendNotificationStrategy; + +public class SmsNotification extends Notification { + + public SmsNotification(String content, User user, SendNotificationStrategy strategy) { + super(content, user, strategy); + } + + @Override + public void send() { + if (isSendable()) + strategy.send(user.id() + " Sms: " + user.name() + " " + content); + } +} diff --git a/src/entities/User.java b/src/entities/User.java new file mode 100644 index 0000000..f832bdc --- /dev/null +++ b/src/entities/User.java @@ -0,0 +1,9 @@ +package entities; + +import utils.NotificationType; +import utils.SendNotificationStrategy; + +import java.util.List; + +public record User(int id, String name, List notificationsTypes, SendNotificationStrategy chosenNotificationStrategy) { +} diff --git a/src/utils/DifferedSendNotificationStrategy.java b/src/utils/DifferedSendNotificationStrategy.java new file mode 100644 index 0000000..6c0a551 --- /dev/null +++ b/src/utils/DifferedSendNotificationStrategy.java @@ -0,0 +1,21 @@ +package utils; + +public class DifferedSendNotificationStrategy implements SendNotificationStrategy { + private int delay; + + public DifferedSendNotificationStrategy(int delay) { + this.delay = delay; + } + + @Override + public NotificationState send(String message) { + try { + Thread.sleep(delay); + } catch (InterruptedException e) { + System.err.println("Cannot wait for differed strategy"); + return NotificationState.KO; + } + System.out.println(message); + return NotificationState.SENT; + } +} diff --git a/src/utils/FastSendNotificationStrategy.java b/src/utils/FastSendNotificationStrategy.java new file mode 100644 index 0000000..1dde522 --- /dev/null +++ b/src/utils/FastSendNotificationStrategy.java @@ -0,0 +1,9 @@ +package utils; + +public class FastSendNotificationStrategy implements SendNotificationStrategy { + @Override + public NotificationState send(String message) { + System.out.println(message); + return NotificationState.SENT; + } +} diff --git a/src/utils/NotificationFacade.java b/src/utils/NotificationFacade.java new file mode 100644 index 0000000..32c0bd0 --- /dev/null +++ b/src/utils/NotificationFacade.java @@ -0,0 +1,5 @@ +package utils; + +public class NotificationFacade { + +} diff --git a/src/utils/NotificationFactory.java b/src/utils/NotificationFactory.java new file mode 100644 index 0000000..88e4276 --- /dev/null +++ b/src/utils/NotificationFactory.java @@ -0,0 +1,13 @@ +package utils; + +import entities.*; + +public class NotificationFactory { + public Notification createNotification(NotificationType type, String content, User user, SendNotificationStrategy strategy) { + return switch (type) { + case Sms -> new SmsNotification(content, user, strategy); + case Mail -> new MailNotification(content, user, strategy); + case Push -> new PushNotification(content, user, strategy); + }; + } +} diff --git a/src/utils/NotificationManager.java b/src/utils/NotificationManager.java new file mode 100644 index 0000000..471f9fd --- /dev/null +++ b/src/utils/NotificationManager.java @@ -0,0 +1,22 @@ +package utils; + + +public class NotificationManager { + private static NotificationManager INSTANCE; + private final NotificationObservable observable; + + private NotificationManager() { + this.observable = new NotificationObservable(); + } + + public static NotificationManager getInstance() { + if (INSTANCE == null) { + INSTANCE = new NotificationManager(); + } + return INSTANCE; + } + + public NotificationObservable getObservable() { + return this.observable; + } +} diff --git a/src/utils/NotificationObservable.java b/src/utils/NotificationObservable.java new file mode 100644 index 0000000..b2798f7 --- /dev/null +++ b/src/utils/NotificationObservable.java @@ -0,0 +1,29 @@ +package utils; + +import entities.User; + +import java.util.ArrayList; +import java.util.List; + +public class NotificationObservable { + private final List subscribers; + + public NotificationObservable() { + this.subscribers = new ArrayList<>(); + } + + public void addSubscribers(User subscriber) { + this.subscribers.add(subscriber); + } + + public void sendNotifications(String content) { + var factory = new NotificationFactory(); + + for (final var subscriber : this.subscribers) { + for (final var notificationType : subscriber.notificationsTypes()) { + var notification = factory.createNotification(notificationType, content, subscriber, subscriber.chosenNotificationStrategy()); + notification.send(); + } + } + } +} diff --git a/src/utils/NotificationState.java b/src/utils/NotificationState.java new file mode 100644 index 0000000..cf0264d --- /dev/null +++ b/src/utils/NotificationState.java @@ -0,0 +1,8 @@ +package utils; + +public enum NotificationState { + PENDING, + SENT, + KO, + READ, +} diff --git a/src/utils/NotificationType.java b/src/utils/NotificationType.java new file mode 100644 index 0000000..71e7eb0 --- /dev/null +++ b/src/utils/NotificationType.java @@ -0,0 +1,7 @@ +package utils; + +public enum NotificationType { + Sms, + Mail, + Push +} diff --git a/src/utils/PriorityDecorator.java b/src/utils/PriorityDecorator.java new file mode 100644 index 0000000..0ec8ddb --- /dev/null +++ b/src/utils/PriorityDecorator.java @@ -0,0 +1,17 @@ +package utils; + +public class PriorityDecorator { + private boolean isPriority; + + public PriorityDecorator(boolean isPriority) { + this.isPriority = isPriority; + } + + public boolean isPriority() { + return isPriority; + } + + public void setPriority(boolean priority) { + isPriority = priority; + } +} diff --git a/src/utils/ReceiptDecorator.java b/src/utils/ReceiptDecorator.java new file mode 100644 index 0000000..39c9a1b --- /dev/null +++ b/src/utils/ReceiptDecorator.java @@ -0,0 +1,17 @@ +package utils; + +public class ReceiptDecorator { + boolean received; + + public ReceiptDecorator() { + this.received = false; + } + + public boolean isReceived() { + return received; + } + + public void setReceived(boolean received) { + this.received = received; + } +} diff --git a/src/utils/SecureSendNotificationStrategy.java b/src/utils/SecureSendNotificationStrategy.java new file mode 100644 index 0000000..dd32ada --- /dev/null +++ b/src/utils/SecureSendNotificationStrategy.java @@ -0,0 +1,15 @@ +package utils; + +public class SecureSendNotificationStrategy implements SendNotificationStrategy { + private int key; + + public SecureSendNotificationStrategy(int key) { + this.key = key; + } + + @Override + public NotificationState send(String message) { + System.out.println(key+"Flcjsdjknesdlkgjsilkqzfjazio"+message+"kjhsdiuhisehifsdhfiuhsuidhuifhjsid"); + return NotificationState.SENT; + } +} diff --git a/src/utils/SendNotificationStrategy.java b/src/utils/SendNotificationStrategy.java new file mode 100644 index 0000000..d1673e8 --- /dev/null +++ b/src/utils/SendNotificationStrategy.java @@ -0,0 +1,5 @@ +package utils; + +public interface SendNotificationStrategy { + NotificationState send(String message); +} diff --git a/src/utils/TimeStampDecorator.java b/src/utils/TimeStampDecorator.java new file mode 100644 index 0000000..a498e9c --- /dev/null +++ b/src/utils/TimeStampDecorator.java @@ -0,0 +1,19 @@ +package utils; + +import java.util.Date; + +public class TimeStampDecorator { + private Date time; + + public TimeStampDecorator(Date time) { + this.time = time; + } + + public Date getTime() { + return time; + } + + public void setTime(Date time) { + this.time = time; + } +}