package ServerSequenceRealization_3 {
private import ScalarValues::String;
private import ServerSequenceModel::*;
private import Configuration::*;
package Configuration {
port def PublicationPort {
in ref publish : Publish;
}
port def SubscriptionPort {
in ref subscribe : Subscribe;
out ref deliver : Deliver;
}
interface def PublicationInterface {
end source : ~PublicationPort;
end target : PublicationPort;
}
interface def SubscriptionInterface {
end source : ~SubscriptionPort;
end target : SubscriptionPort;
}
part producer_3[1] {
attribute someTopic : String;
private item somePublication;
port publicationPort : ~PublicationPort {
out ref :>> publish;
}
perform action producerBehavior {
action publish {
out ref request : Publish[1] = new Publish(someTopic, somePublication);
}
}
flow publish_request from producerBehavior.publish.request to publicationPort.publish;
}
interface publication_interface : PublicationInterface connect producer_3.publicationPort to server_3.publicationPort {
flow publish_request from publication_interface.source.publish to publication_interface.target.publish;
}
part server_3[1] {
port publicationPort : PublicationPort {
in ref :>> publish;
}
port subscriptionPort : SubscriptionPort {
in ref :>> subscribe;
out ref :>> deliver;
}
flow subscribe_request from subscriptionPort.subscribe to serverBehavior.subscribing.request;
flow publish_request from publicationPort.publish to serverBehavior.publishing.request;
flow deliver_response from serverBehavior.delivering.response to subscriptionPort.deliver;
perform action serverBehavior {
action subscribing {
in ref request : Subscribe[1];
out attribute topic : String[1] = request.topic;
}
then merge continuePublishing;
then action publishing {
in ref request : Publish[1];
out attribute topic[1] = request.topic;
out ref publication[1] = request.publication;
}
then decide;
if publishing.topic == subscribing.topic then delivering;
else continuePublishing;
then action delivering {
in topic : String[1] = subscribing.topic;
in publication[1] = publishing.publication;
out ref response : Deliver = new Deliver(publication);
}
then continuePublishing;
}
}
interface subscription_interface : SubscriptionInterface connect consumer_3.subscriptionPort to server_3.subscriptionPort {
flow subscribe_request from subscription_interface.source.subscribe to subscription_interface.target.subscribe;
flow deliver_response from subscription_interface.target.deliver to subscription_interface.source.deliver;
}
part consumer_3[1] {
attribute myTopic : String;
port subscriptionPort : ~SubscriptionPort {
out ref :>> subscribe;
in ref :>> deliver;
}
flow subscribe_request from consumerBehavior.subscribe.request to subscriptionPort.subscribe;
flow deliver_response from subscriptionPort.deliver to consumerBehavior.delivery.response;
perform action consumerBehavior {
action subscribe {
out ref request : Subscribe = new Subscribe(myTopic);
}
then action delivery {
in ref response : Deliver;
}
}
}
}
part realization_2 : PubSubSequence {
part :>> producer :> producer_3 {
event producerBehavior.publish[1] :>> publish_source_event;
}
part :>> server :> server_3 {
event serverBehavior.subscribing[1] :>> subscribe_target_event;
event serverBehavior.publishing[1] :>> publish_target_event;
event serverBehavior.delivering[1] :>> deliver_source_event;
}
part :>> consumer :> consumer_3 {
event consumerBehavior.subscribe[1] :>> subscribe_source_event;
event consumerBehavior.delivery[1] :>> deliver_target_event;
}
flow :>> publish_message from producer.producerBehavior.publish.request to server.serverBehavior.publishing.request {
event producer.publish_request[1];
then event publication_interface.publish_request[1];
then event server.publish_request[1];
}
flow :>> subscribe_message from consumer.consumerBehavior.subscribe.request to server.serverBehavior.subscribing.request {
event consumer.subscribe_request[1];
then event subscription_interface.subscribe_request[1];
then event server.subscribe_request[1];
}
flow :>> deliver_message from server.serverBehavior.delivering.response to consumer.consumerBehavior.delivery.response {
event server.deliver_response[1];
then event subscription_interface.deliver_response[1];
then event consumer.deliver_response[1];
}
}
}