Skip to main content

Coreografie

Legenda

NomeSiglaNote
ACMEACMEIndica l'azienda AcmeSky
Airline serviceAIRkIndica la k-esima compagnia aerea
Rent serviceRENTtIndica la t-esima compagnia di noleggio
ProntogramPTGIndica il servizio di messagistica
Bank serviceBANKIndica il servizio bancario
Geodistance serviceGEOIndica il servizio di calcolo distanze
UserUSERxIndica l'x-esimo utente

Coreografie globali


( requestInterest: USER-> ACME ; responseInterest: ACME -> USER)*
|

( queryFlights: ACME -> AIR; responseFlights: AIR-> ACME )*
|

( sendLastMinute: AIR-> ACME ; responseLastMinute: ACME -> AIR)*
|

( offerToken: ACME -> PTG ; notifyUser: PTG -> USER;
notifyResponse: USER-> PTG ; messageSended: PTG -> ACME )*
|

(
confirmOffer: USER-> ACME ;
(
(
responseOfferOk: ACME -> USER;
requestPaymentLink: USER-> ACME ;
bookTickets: ACME -> AIR;
(
(
responseTickets: AIR-> ACME ;
requestBankLink: ACME -> BANK ;
responselink: BANK -> ACME ;
paymentLink: ACME -> USER;

(
(
payment: USER-> BANK ;
successPaymentBank: BANK -> ACME ;
(
// Richiesta a Geodistance se costo > 1000€
1
+
(
requestDistance: ACME -> GEO ;
responseDistance: GEO -> ACME ;
( // Richiesta a Rent service se distanza <30Km
1
+
(
(
requestDistanceRent: ACME -> GEO ;
responseDistanceRent: GEO -> ACME ;
)* ;
requestRent: ACME -> RENT;
responseRent: RENT-> ACME ;
)
)
)
) ;
SendJourneyInvoice: ACME -> USER;
)
)
)
)
)
)
)*

Verifica connectedness delle coreografie

Per verificare se la coreografia fornita verifica la proprietà di connessione, dobbiamo scomporla e analizzare ogni composizione, scelta e iterazione sequenziale. Di seguito un'analisi dettagliata della coreografia asincrona precedentemente rappresentata, passo dopo passo: Per quanto riguarda la prima parte della coreografia globale:

( requestInterest: USER-> ACME ; responseInterest: ACME -> USER)* 
|
( queryFlights: ACME -> AIR; responseFlights: AIR-> ACME )*
|
( sendLastMinute: AIR-> ACME ; responseLastMinute: ACME -> AIR)*
|
( offerToken: ACME -> PTG ; notifyUser: PTG -> USER;
notifyResponse: USER-> PTG ; messageSended: PTG -> ACME )*

La proprietà di connectedness è verificata in quanto si tratta di operazioni parallele, in cui il mittente della prima operazione è il ricevente della seconda operazione e, viceversa, il ricevente della prima operazione è il mittente della seconda e i ruoli rimangono gli stessi.

Per quanto riguarda invece l'operazione confirmOffer:

confirmOffer: USER-> ACME ; 
(
// Confirmation of the offer
responseOfferOk: ACME -> USER;
requestPaymentLink: USER-> ACME ;
bookTickets: ACME -> AIR;
(
// Booking tickets and payment link generation
responseTickets: AIR-> ACME ;
requestBankLink: ACME -> BANK ;
responselink: BANK -> ACME ;
paymentLink: ACME -> USER;
(
// Payment process
payment: USER-> BANK ;
successPaymentBank: BANK -> ACME ;
(
// Additional services based on payment amount
1
+
(
requestDistance: ACME -> GEO ;
responseDistance: GEO -> ACME ;
(
1
+
(
requestDistanceRent: ACME -> GEO ;
responseDistanceRent: GEO -> ACME ;
requestRent: ACME -> RENT;
responseRent: RENT-> ACME ;
)
)
)
) ;
SendJourneyInvoice: ACME -> USER;
)
)
)

Passo 1: confirmOffer: USERₓ -> ACME ; responseOfferOk: ACME -> USERₓ

  • USERₓ -> ACME
  • ACME -> USERₓ
  • Connettività: USERₓ è il mittente della prima interazione e il ricevente della seconda interazione, quindi è connesso.

Passo 2: responseOfferOk: ACME -> USERₓ ; requestPaymentLink: USERₓ -> ACME-

  • ACME -> USERₓ
  • USERₓ -> ACME
  • Connettività: USERₓ è coinvolto in entrambe le interazioni, garantendo la connettività.

Passo 3: requestPaymentLink: USERₓ -> ACME ; bookTickets: ACME -> AIRₖ

  • USERₓ -> ACME
  • ACME -> AIRₖ
  • Connettività: ACME è coinvolto in entrambe le interazioni, garantendo la connettività.

Passo 4: bookTickets: ACME -> AIRₖ ; responseTickets: AIRₖ -> ACME

  • ACME -> AIRₖ
  • AIRₖ -> ACME
  • Connettività: ACME e AIRₖ sono coinvolti in entrambe le interazioni, garantendo la connettività.

Passo 5: responseTickets: AIRₖ -> ACME ; requestBankLink: ACME -> BANK

  • AIRₖ -> ACME
  • ACME -> BANK
  • Connettività: ACME è coinvolto in entrambe le interazioni, garantendo la connettività.

Passo 6: requestBankLink: ACME -> BANK ; responselink: BANK -> ACME

  • ACME -> BANK
  • BANK -> ACME
  • Connettività: ACME e BANK sono coinvolti in entrambe le interazioni, garantendo la connettività.

Passo 7: responselink: BANK -> ACME ; paymentLink: ACME -> USERₓ

  • BANK -> ACME
  • ACME -> USERₓ
  • Connettività: ACME è coinvolto in entrambe le interazioni, garantendo la connettività.

Passo 8: paymentLink: ACME -> USERₓ ; payment: USERₓ -> BANK

  • ACME -> USERₓ
  • USERₓ -> BANK
  • Connettività: USERₓ è coinvolto in entrambe le interazioni, garantendo la connettività.

Passo 9: payment: USERₓ -> BANK ; successPaymentBank: BANK -> ACME

  • USERₓ -> BANK
  • BANK -> ACME
  • Connettività: BANK è coinvolto in entrambe le interazioni, garantendo la connettività.

Passo 10: successPaymentBank: BANK -> ACME

  • Branch 1: 1

  • Branch 2: requestDistance: ACME -> GEO ; responseDistance: GEO -> ACME

    • Connettività: Il primo Branch 1 rappresenta un elemento neutro (nessuna interazione), quindi è connesso. Nel secondo Branch, ACME è coinvolto in entrambe le interazioni: ACME -> GEO ; GEO -> ACME

Passo 11: responseDistance: GEO -> ACME

  • Branch 1: 1

  • Branch 2: requestDistanceRent: ACME -> GEO ; responseDistanceRent: GEO -> ACME ; requestRent: ACME -> RENTₜ ; responseRent: RENTₜ -> ACME

    • Connettività: Il primo Branch 1 è un elemento neutro. Nel secondo Branch: ACME -> GEO ; GEO -> ACME; ACME -> RENTₜ ; RENTₜ -> ACME. ACME è coinvolto in tutte le interazioni, garantendo la connettività.

Passo 12: Interazione finale SendJourneyInvoice: ACME -> USERₓ in risposta a USERₓ -> ACME

Conclusione

Ogni composizione sequenziale si connette appropriatamente con almeno un ruolo condiviso. Ogni scelta assicura che gli stessi ruoli siano coinvolti inizialmente e non crea rami disconnessi. Le iterazioni coinvolgono ruoli consistenti durante tutto il corpo del ciclo. Pertanto, l'operazione confirmOffer, insieme alle sue interazioni annidate, verifica la proprietà di connettività, assicurando che la coreografia sia connessa.

Proiezioni

Nella sezione seguente vengono descritte solamente le proiezioni considerante significative per i rispettivi ruoli / attori.

ACMEsky

proj(FlightQuery, ACME) = 
____________
( queryFlights@AIR; responseFlights@AIR)*
proj(ReceiveLastMinute, ACME) = 
__________________
( sendLastMinute@AIR; responseLastMinute@AIR)*
proj(RegisterInterest, ACME) = 
________________
( requestInterest@USER; responseInterest@USER)*
proj(SendOffer, ACME) = 
__________
( offer@PTG ; 1 ; 1 ; messageSent@PTG )*
proj(confirmOffer, ACME) = 
( confirmOffer@USER;
( _______________ ___________
(responseOfferOk@USER; requestPaymentLink@USER; bookTickets@AIR
(
(
responseTickets@AIR;
______________
requestBankLink@BANK ; responselink@BANK ;
___________
paymentLink@USER; 1 ;
(
(
1; successPaymentBank@BANK ;
_______________
( 1 + ( requestDistance@GEO ; responseDistance@GEO ;
___________________
( 1 + ( ( requestDistanceRent@GEO ; responseDistanceRent@GEO )* ;
___________
requestRent@RENT; responseRent@RENT;
)
)
); __________________
) SendJourneyInvoice@USER
)
)
)
)
)
)
)*

Utente

proj(RegisterInterest, USER) = 
_______________
( requestInterest@ACME ; responseInterest@ACME )*
proj(SendOffer, USER) = 
______________
( 1 ; notifyUser@PTG ; notifyResponse@PTG ; 1 )*
proj(confirmOffer, USER) = 
____________
( confirmOffer@ACME ;
( __________________
( responseOfferOk@ACME ; requestPaymentLink@ACME ; 1 ;
( _______
( 1 ; 1 ; 1 ; paymentLink@ACME ; payment@BANK ;
(
(
1 ; //successPaymentBank: BANK ->ACME
( 1 + ( 1 ; 1 ; //req distance
( 1 + (( 1 ; 1)* ; 1 ; 1 ;))
)
); SendJourneyInvoice@ACME
)
)
)
)
)
)
)*

Airline service

proj(QueryFlights, AIR) = 
_______________
( queryFlights@ACME ; responseFlights@ACME )*
proj(sendLastMinute, AIR) = 
______________
( sendLastMinute@ACME ; responseLastMinute@ACME )*
proj(confirmOffer, AIR) =
( 1 ;
(
(1 ; 1 ; bookTickets@ACME ;
(
( _______________
responseTickets@ACME ;
1 ; 1 ; 1 ;
(
( 1; 1 ;
( 1 + ( 1 ; 1 ;)*
(1 ; 1 )
) 1 ;
)
)
)
)
)
)
)*

Prontogram

proj(SendOffer, PTG) = 
__________
( offerToken@ACME ; notifyUser@USER;
_____________
notifyResponse@USER; messageSended@ACME )*

Bank service

proj(confirmOffer, BANK) = 
( 1 ;
(
( 1 ; 1 ; 1 ;
(
( ____________
1 ; requestBankLink@ACME ; responselink@ACME ; 1
(
( __________________
payment@USER;successPaymentBank@ACME ;
(
1 + ( 1 ; 1 ;
( 1 + (( 1 ; 1)* ; 1 ; 1))
)) 1 ;
)
)
)
)
)
)
)*

Geographical Distance service

proj(confirmOffer, GEO) = 
( 1 ;
(
( 1 ; 1 ; 1 ;
(
( 1 ; 1 ; 1 ; 1;
(
(
1 ; 1;
________________
( 1 + ( requestDistance@ACME ; responseDistance@ACME ;
____________________
( 1 + (( requestDistanceRent@ACME ; responseDistanceRent@ACME )* ;
) 1; 1)
)
) 1 ;
)
)
)
)
)
)
)*

Rent Service

proj(confirmOffer, RENT) = 
( 1 ;
(
( 1 ; 1 ; 1 ;
(
( 1 ; 1 ; 1 ; 1 ;
(
( 1 ; 1 ;
( 1 + ( ( 1 ; 1 )*;
____________
requestRent@ACME ; responseRent@ACME ;
)
) 1 ;
)
)
)
)
)
)
)*