Sunteți pe pagina 1din 6

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei


Facultatea Calculatoare Informatica si
Microelectronica Departamentul Ingineria
Software si Automatica

RAPORT
Disciplina: TMPS
Tema: Library Manager
Chain of ResponsibilityPattern

A efectuat: Baranov Oleg


st. gr. TI-172

A verificat: Scrob Sergiu

Chisinau 2020
Mersul lucrării:
Chain of Responsibility - model de design comportamental care permite să trecem cererile
de-a lungul unui lanț de manipulatori. La primirea unei solicitări, fiecare handler decide fie să
proceseze solicitarea, fie să o transmită următorului operator din lanț.

Problema:
La ivirea unor probleme, atât de nivel înalt, cât și nesemnificative, a apărut necesitatea de
creare și de anunțare a manager-ului despre problemă, iar cu cât problema este mai serioasă, cu
atât mai repede trebuie de anunțat manager-ul.

Motivația:
Pattern-ul Chain of Responsibility ne permite crearea unui lang de manipulare a unor
aspecte. În cazul nostru este manipularea cu notificarile, astfel cu cât mai înalt este nivelul, cu
atât mai departe ea necesită a fi transmisă și procesată.

Figura 1 – Diagrama UML


Clasa abstractă Notifier conține în sine câmpurile priority și nextNotifier, și trei metode –
setNextNotifier(Notifier nextNotifier), notifyManager(String message, int level), write(String
message), care și sunt moștenite de către clasele ReportNotifier, EmailNotifier și SMSNotifier.

public abstract class Notifier {

private int priority;


private Notifier nextNotifier;

public Notifier(int priority) {


this.priority = priority;
}

public void setNextNotifier(Notifier nextNotifier) {


this.nextNotifier = nextNotifier;
}

public void notifyManager(String message, int level) {


if (level >= priority) {
write(message);
}
if (nextNotifier != null) {
nextNotifier.notifyManager(message, level);
}
}

public abstract void write(String message);

Pentru crearea lanțului fiecare clasă primește în constructor câte o prioritate ce se conține în
clasa Priority:

public class Priority {


public static final int LOW = 1;
public static final int MEDIUM = 2;
public static final int HIGH = 3;
}

Fiecare clasă deja conține în sine metoda write() ce formează și transmite notificarea, iar
apoi afișează un mesaj în consolă. Astfel ReportNotifier conține metoda createReport, clasa
EmailNotifier – sendEmail și clasa SMSNotifier – sendSMS.
Clasa ReportNotifier:

public class ReportNotifier extends Notifier {

public ReportNotifier(int priority) {


super(priority);
}
@Override
public void write(String message) {
System.out.println("Create report: " + message);
createReport(message);
}

private void createReport(String message) {


DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd
HH:mm:ss");
LocalDateTime time = LocalDateTime.now();

TemporaryFolder folder = new TemporaryFolder();

File file = new folder.newFile("Report - " + time.format(dtf) +


".txt");

Writer writer = null;


try {
writer = new BufferedWriter(new FileWriter(file));
writer.write(message);
} catch (IOException ex) {

Logger.getLogger(ReportNotifier.class.getName()).log(Level.SEVERE, null,
ex);
}
}
}

Clasa EmailNotifier:

public class EmailNotifier extends Notifier {

public EmailNotifier(int priority) {


super(priority);
}

@Override
public void write(String message) {
System.out.println("Sending email to manager: " + message);
sendEmail(message);
}

private void sendEmail(String messageToSend) {


String sendTo = "andante.sandero@gmail.com";
String messageSubject = "Bug";

Properties properties = new Properties();


properties.put("mail.smtp.host", "smtp.gmail.com");
properties.put("mail.smtp.port", "587");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.starttls.enable", "true"); //TLS

Session session = Session.getInstance(properties,


new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(MailController.username,
MailController.password);
}
});

Message message;

try {

message = new MimeMessage(session);


message.setFrom(new InternetAddress(MailController.username));
message.setRecipients(
Message.RecipientType.TO,
InternetAddress.parse(sendTo)
);

message.setSubject(messageSubject);
message.setText(messageToSend);

} catch (Exception e) {
System.out.println(e);
}
}

Clasa SMSNotifier:

public class SMSNotifier extends Notifier {

public SMSNotifier(int priority) {


super(priority);
}

@Override
public void write(String message) {
System.out.println("Sending SMS to manager: " + message);
sendSMS(message);
}

private void sendSMS(String message) {


static final String ACCOUNT_SID = System.getenv("TWILIO_ACCOUNT_SID");
static final String ACCOUNT_SID = System.getenv("TWILIO_AUTH_TOKEN");

Message phoneMessage = Message.creator(


new PhoneNumber(System.getenv("MY_PHONE_NUMBER")),
new PhoneNumber("+37360543290"),
message
).create();
}
Figura 2 – Transmiterea notificării la nivelul I

Figura 3 – Transmiterea notificării la nivelul II

Figura 4 – Transmiterea notificării la nivelul III

S-ar putea să vă placă și