package ServerSequenceOutsideRealization_2 {
private import ScalarValues::String;
private import ServerSequenceModelOutside::*;
private import Configuration::*;
package Configuration {
port def PublicationPort;
port def SubscriptionPort;
part producer_2[1] {
attribute someTopic : String;
private item somePublication;
/* Requiring FIFO sort (as opposed to just default) to make arrival/leave ordering
* in ServerSequenceModelOutside.sysml equivalent to accept/send new ordering in
* ServerSquenceRealization-2.sysml. */
:>> incomingTransferSort = Occurrences::earlierFirstIncomingTransferSort;
port publicationPort : ~PublicationPort;
perform action producerBehavior {
action publish send new Publish(someTopic, somePublication) via publicationPort;
}
}
interface producer_2.publicationPort to server_2.publicationPort;
part server_2[1] {
port publicationPort : PublicationPort;
port subscriptionPort : SubscriptionPort;
:>> incomingTransferSort = Occurrences::earlierFirstIncomingTransferSort;
exhibit state serverBehavior {
entry; then waitForSubscription;
state waitForSubscription;
transition subscribing
first waitForSubscription
accept sub : Subscribe via subscriptionPort
then waitForPublication;
state waitForPublication;
transition delivering
first waitForPublication
accept pub : Publish via publicationPort
if pub.topic == subscribing.sub.topic
do send new Deliver(pub.publication) to subscribing.sub.subscriber
then waitForPublication;
}
}
interface consumer_2.subscriptionPort to server_2.subscriptionPort;
part consumer_2[1] {
attribute myTopic : String;
:>> incomingTransferSort = Occurrences::earlierFirstIncomingTransferSort;
port subscriptionPort : ~SubscriptionPort;
perform action consumerBehavior {
action subscribe send new Subscribe(myTopic, consumer_2) to server_2;
then action delivery accept Deliver via consumer_2;
}
}
}
part realization_2 : PubSubSequence {
part :>> producer :> producer_2;
part :>> server :> server_2;
part :>> consumer :> consumer_2;
message :>> publish_message: Transfers::MessageTransfer {
end :>> source = producer.publicationPort;
end :>> target = server.publicationPort;
}
message :>> subscribe_message: Transfers::MessageTransfer {
end :>> source = consumer.subscriptionPort;
end :>> target = server.subscriptionPort;
}
message :>> deliver_message: Transfers::MessageTransfer {
end :>> source = server;
end :>> target = consumer;
}
/* Binding sent/accept messages to specification model messages. */
/* Sends */
bind producer_2.producerBehavior.publish.sentMessage = publish_message;
bind consumer_2.consumerBehavior.subscribe.sentMessage = subscribe_message;
bind server_2.serverBehavior.delivering.effect.sentMessage = deliver_message;
/* Accepts */
bind consumer_2.consumerBehavior.delivery.acceptedMessage = subscribe_message;
bind server_2.serverBehavior.subscribing.accepter.acceptedMessage = subscribe_message;
bind server_2.serverBehavior.delivering.accepter.acceptedMessage = publish_message;
}
}