Capítulo 5 Descripción de los Patrones de Comunicación para las RIA
7.2 Modelo de marcas empleado
7.3.2 Transformación de los patrones de comunicación En cada patrón de comunicación, los objetos interactúan de manera diferente Para
cada objeto del modelo de análisis, se generan uno o más componentes del modelo de arquitectura, dependiendo del tipo de objeto, ya sea <<boundary>>, <<control>> o <<entity>>. En primer lugar se generan los paquetes del lado del cliente y del lado del servidor donde se van a colocar las componentes generadas para el modelo de arquitectura. Para cada uno de esos paquetes se genera un grafo que contiene como nodos las componentes y las interfaces ofrecidas por estas componentes y como arcos las relaciones de dependencia <<use>> y de herencia entre componentes e interfaces. Primero se generan las componentes para los objetos <<boundary>>, luego para los objetos <<control>> y finalmente para los objetos <<entity>>. Finalmente se crean las relaciones de tipo <<inherit>> y de tipo <<use>> entre los componentes y las interfaces. Para cada componente generado, se crean las interfaces que ofrece y un objeto.
59 7.3.3 Generación de Componentes de Arquitectura para el patrón ClientServer
7.3.3 Generación de Componentes de Arquitectura para el patrón Client
Server
La Figura 71 y 72 muestran el resultado del mapeo de un diagrama de comunicaciones del modelo de análisis a diagrama de componentes del modelo de arquitectura. El escenario utilizado es un usuario que agrega un producto a su carrito de compras y el estado del carrito es almacenado.
60 7.3.3 Generación de Componentes de Arquitectura para el patrón ClientServer
Figura 7-2: Resultado del mapeo a componentes del diagrama de la Figura 7-1.
Aplicando la regla de transformación boundaryObjects2UIVisualComponents al objeto <<boundary>> ShoppingCartUI se transforma en ProductList, ShoppingCart y StatusMessage ambos con estereotipo UIVisualComponent. Luego, aplicando controlObject2ComponentsForClientServerPattern al objeto <<control>> ShoppingCartEventProcessor se generan las componentes EventCoordinator, ShoppingCartController, AsyncRemoteRequest y ShoppingCartServerController. Por último, en este caso el modelo de marcas indica que el objeto <<entity>> ShoppingCartData utiliza almacenamiento persistente. Luego, aplicando la regla de transformación generateEntityObject2PesistentStorageComponentComponent se transforma en ShoppingCartDAO y DataSourceConnector.
61 7.3.3 Generación de Componentes de Arquitectura para el patrón ClientServer
function clientServerCommPattern2ComponentDiagram(communicationPattern, storageTypes, storageTypeActor, serverComposedEvents,
clientComposedEvents) begin
var clientPackages = generateClientPackages(communicationPattern) var serverPackage = generateServerPackage()
var generatedUIVisualComponents = []
foreach object in communicationPattern->objects do
if object->stereotype == 'boundary' and object->type == 'UI' then boundaryObjects2UiVisualComponents(object, clientPackages, generatedUIVisualComponents)
elseif object->stereotype == 'boundary' and object->type == 'Timer' then
boundaryObject2TimerComponent(object, clientPackages) elseif object->stereotype == 'boundary' and object->type == 'ConectorProtocoloRed' then
boundaryObject2ProtocoloRedComponent(object, serverPackage) elseif object->stereotype == 'control' then
controlObject2ComponentsForClientServerPattern(communicationPattern, clientPackages, serverPackage, clientComposedEvents)
fi
elseif object->stereotype == 'entity' then if storageTypes[entity] == 'persistent' or storageTypes[entity] == 'both' then
generateEntityObject2PesistentStorageComponent(serverPackage, object) fi
if storageTypes[entity] == 'volatil' or storageTypes[entity] == 'both' then entityObject2VolatilStorageComponent(storageTypeActor[entity], clientPackages, object) fi fi od generateClientUseRelationships(communicationPattern, clientPackages) generateServerUseRelationships(serverPackage, serverEventAdministatorPackage) end
Tabla 7-2: Función de transformación de diagrama de comunicaciones de modelo de análisis a diagrama de componentes de modelo de arquitectura intependiente de plataforma para el patrón de comunicaciones Cliente-Servidor.
7.3.4 Transformación de modelos de análisis respetando el patrón Client
ServerClients a arquitectura de componentes
Las Figura 73 y 74 ilustran el resultado del mapeo de un caso de uso que sigue este patrón de comunicación. En este caso, es escenario es una aplicación chat, donde un usuario envía un mensaje a uno o más usuarios.62 7.3.4 Transformación de modelos de análisis respetando el patrón ClientServerClients a arquitectura de componentes
Figura 7-3: Diagrama de comunicación de un caso de uso que sigue el patrón client-server- clients.
63 7.3.4 Transformación de modelos de análisis respetando el patrón ClientServerClients a arquitectura de componentes
Figura 7-4: Resultado del mapeo de componentes del diagrama de la Figura 7-3.
Aplicando la regla de transformación boundaryObjects2UIVisualComponents al obje to <<boundary>> ChatWindowUI_Usuario1 se transforma en <<UIVisualCompo Component>> ChatNewMessageTextBox y <<UIVisualComponent>> ChatMessa geBox. Luego, aplicando controlObject2ComponentsForClientServerClientsPattern al objeto <<control>> ChatMessageEventProcessor se generan las componentes <<ClientController>> ChatMessageController, <<ProcesadorPedidPersistente>> ProcesadorPedidoPersistente, <<PublishSubscribeAdministrator>> PublishSubscribeAdministrator y <<DistribuidorEventos>> DistribuidorEventos. Por último, aplicando la transformación generateEntityObject2PesistentStorage ComponentComponent, el objeto <<entity>> SubscriptionList se transforma en <<SubscriptionList>> SubscriptionList y el objeto <<entity>> Notifications HistoryEntity se transforma en <<DAO>>NotificationsHistory.
64 7.3.4 Transformación de modelos de análisis respetando el patrón ClientServerClients a arquitectura de componentes
function
clientServerClientsCommPattern2ComponentDiagram(communicationPattern, storageTypes, storageTypeActor, serverComposedEvents,
clientComposedEvents) begin
var clientPackages = generateClientPackages(communicationPattern) var serverPackage = generateServerPackage()
var serverEventsAdministratorPackage = generateAdministradorEventosServidorPackage() var serverAndServerEventsPackage =
generateServerAndServerEventsPackage() var generatedUIVisualComponents = []
foreach object in communicationPattern->objects do
if object->stereotype == 'boundary' and object->type == 'ExternalApp' then
boundaryObject2ExternalAppInterface() fi
if object->stereotype == 'boundary' and object->type == 'UI' then boundaryObjects2UiVisualComponents(object, clientPackages, generatedUIVisualComponents)
elseif object->stereotype == 'boundary' and object->type == 'Timer' then
boundaryObject2TimerComponent(object, clientPackages) elseif object->stereotype == 'boundary' and object->type == 'ConectorProtocoloRed' then
boundaryObject2ProtocoloRedComponent(object, serverPackage) elseif object->stereotype == 'control' then
controlObject2ComponentsForClientServerClientsPattern(communicationPattern , clientPackages, serverPackage, serverEventsAdministratorPackage,
serverComposedEvents)
elseif object->stereotype == 'entity' then if storageTypes[entity] == 'persistent' or storageTypes[entity] == 'both' then
generateEntityObject2PesistentStorageComponentComponent(serverPackage, object)
fi
if storageTypes[entity] == 'volatil' or storageTypes[entity] == 'both' then entityObject2VolatilStorageComponent(storageTypeActor[entity], clientPackages, object) fi fi markAsVisited(object) od generateClientUseRelationships(communicationPattern, clientPackages) generateServerUseRelationships(serverPackage) generateServerEventAdministratorUseRelationships(serverEventAdministratorP ackage) generateServerAndServerEventsUseRelationships(serverAndServerEventsPackage , serverPackage, serverEventAdministratorPackage) end
Tabla 7-3: Función de transformación de diagrama de comunicaciones de modelo de análisis a diagrama de componentes de modelo de arquitectura intependiente de plataforma para el patrón de comunicaciones Cliente-Servidor-Clientes.
65 7.3.5 Transformación de modelos de análisis respetando el patrón ClientServerExternalApps a arquitectura de componentes
7.3.5 Transformación de modelos de análisis respetando el patrón Client
ServerExternalApps a arquitectura de componentes
Las Figuras 75 y 76 ilustran el mapeo para este patrón.Figura 7-5: Diagrama de comunicaciones del modelo de análisis de un caso de uso con patrón de comunicación client-server-externalapps.
66 7.3.5 Transformación de modelos de análisis respetando el patrón ClientServerExternalApps a arquitectura de componentes
Figura 7-6: Resultado de la transformación del diagrama de comunicaciones de la Figura 7- 5 a diagrama de componentes de modelo de arquitectura.
Aplicando la regla de transformación boundaryObjects2UIVisualComponents al objeto <<boundary>> SharePricesUI se transforma en <<UIVisualComponent>> PricesList. Luego, aplicando controlObject2ComponentsForClientServerClients Pattern al objeto <<control>> NewSharePriceEventProcessor se generan las compo nentes <<ClientController>> PricesController, <<ProcesadorPedidPersistente>> ProcesadorPedidoPersistente, <<PublishSubscribeAdministrator>> Publish SubscribeAdministrator y <<DistribuidorEventos>> DistribuidorEventos. Después, aplicando la transformación generateEntityObject2PesistentStorageComponent, el objeto <<entity>> SubscriptionList se transforma en <<SubscriptionList>> SubscriptionList y el objeto <<entity>> NotificationsHistoryEntity se transforma en
67 7.3.5 Transformación de modelos de análisis respetando el patrón ClientServerExternalApps a arquitectura de componentes <<DAO>>NotificationsHistory. Finalmente, aplicando la transformación boundaryObject2ExternalAppInterface al objeto <<boundary>> ExternalAppInterface se transforma en <<ExternalAppInterface>> ExternalAppInterface. function clientServerExternalAppsCommPattern2ComponentDiagram(communicationPattern, storageTypes, storageTypeActor, serverComposedEvents,
clientComposedEvents) begin
var clientPackages = generateClientPackages(communicationPattern) var serverPackage = generateServerPackage()
var serverEventsAdministratorPackage = generateAdministradorEventosServidorPackage() var serverAndServerEventsPackage =
generateServerAndServerEventsPackage() var generatedUIVisualComponents = []
foreach object in communicationPattern->objects do
if object->stereotype == 'boundary' and object->type == 'UI' then boundaryObjects2UiVisualComponents(object, clientController, clientPackages, generatedUIVisualComponents)
elseif object->stereotype == 'boundary' and object->type == 'ExternalApp' then
boundaryObject2ExternalAppInterface()
elseif object->stereotype == 'boundary' and object->type == 'Timer' then
boundaryObject2TimerComponent(object, clientPackages) elseif object->stereotype == 'boundary' and object->type == 'ConectorProtocoloRed' then
boundaryObject2ProtocoloRedComponent(object, serverPackage) elseif object->stereotype == 'control' then
controlObject2ComponentsForClientServerExternalAppsPattern(communicationPa ttern, clientPackages, serverPackage, serverComposedEvents,
clientComposedEvents, serverEventsAdministratorPackage) elseif object->stereotype == 'entity' then
if storageTypes[entity] == 'persistent' or storageTypes[entity] == 'both' then
generateentityObject2PesistentStorageComponentComponent(serverPackage, object)
fi
if storageTypes[entity] == 'volatil' or storageTypes[entity] == 'both' then entityObject2VolatilStorageComponent(storageTypeActor[entity], clientPackages, object) fi fi od generateClientUseRelationships(communicationPattern, clientPackages) generateServerUseRelationships(serverPackage) generateServerEventAdministratorUseRelationships(serverEventAdministratorP ackage) generateServerAndServerEventsUseRelationships(serverAndServerEventsPackage , serverPackage, serverEventAdministratorPackage) end
Tabla 7-4: Función de transformación de diagrama de comunicaciones de modelo de análisis a diagrama de componentes de modelo de arquitectura intependiente de plataforma para el patrón de comunicaciones Cliente-Servidor-ExternalApps.
68 7.3.6 Transformación de modelos de análisis respetando el patrón ExternalAppsServerClients a arquitectura de componentes