Saltar al contenido principal

Metamodelado de la estructura y el comportamiento de interacción de interfaces de usuario basadas en componentes cooperativos

Trabajo desarrollado para Jornal of Universal Computer Science (JUCS)

En los sistemas de información cooperativos basados en la Web (SICWeb), grupos de usuarios con distintos roles cooperan a través de interfaces especializadas. La interacción cooperativa y las estructuras de interfaz de usuario suelen ser bastante complicadas, y el modelado desempeña un papel importante en ellas. La Ingeniería Dirigida por Modelos (MDE) es una disciplina de la ingeniería del software que ayuda a los ingenieros a abstraer las implementaciones de los sistemas mediante modelos y metamodelos. Este trabajo describe un metamodelo interactivo y estructural para interfaces de usuario basado en arquitecturas de componentes como forma de abstraer, modelar, simplificar y facilitar la implementación. El trabajo también presenta un estudio de caso basado en un Sistema de Información de Gestión Medioambiental (EMIS), en el que tres actores (un político, un experto en SIG y un técnico) cooperan en la evaluación de catástrofes naturales.


Contenido

  1. Metamodelos de base del sistema
  2. Ejemplo sencillo de funcionamiento
    2.1. Interfaces de usuario
    2.2. Diagrama de secuencia de interacción del usuario
  3. Metamodelo de arquitectura
    3.1. Subconjunto de interacción 3.2. Subconjunto estructural

Metamodelos de base del sistema

Las interfaces de usuario se tratan como un conjunto de modelos. Un modelo es una instancia de un metamodelo, que establece las reglas y elementos que describen el sistema. Nuestro sistema se construye sobre la base de dos metamodelos que se muestran en la figura:

El metamodelo de arquitectura define la arquitectura de los componentes describiendo su estructura y comportamiento. Este metamodelo se divide en tres subconjuntos: el metamodelo de estructura, el metamodelo visual y el metamodelo de interacción. El primero modela las dependencias de composición entre componentes a través de puertos de conexión (es decir, interfaces proporcionadas y requeridas). El metamodelo visual modela el comportamiento de los componentes visuales mediante una máquina de estados. El metamodelo de interacción modela el comportamiento de interacción con el usuario y describe la estructura de las tareas de interacción que los usuarios pueden ejecutar en el sistema.

Ejemplo sencillo de funcionamiento

El estudio de caso está relacionado con una típica tarea cooperativa de toma de decisiones en un Sistema de Información Medioambiental para evaluar catástrofes naturales. Esta tarea cooperativa evalúa los daños causados por una catástrofe en una determinada zona terrestre (por ejemplo, una zona boscosa).

Interfaces de usuario

En esta tarea participan tres usuarios con tres roles diferentes: un político, un experto en SIG y un evaluador. En la siguiente figura se muestra un ejemplo de las tres interfaces de usuario manejadas por cada uno de los tres actores:

La GUI del Político tiene dos componentes, un gestor de información (DataManager) y un generador de informes (ReportManager). La del Experto tiene cuatro componentes de interfaz, un visor de mapas geográficos, un visor de histogramas, un generador de análisis y un chat en línea (utilizado para comunicarse con el evaluador para la toma de decisiones). La del Evaluador tiene otros tres componentes de interfaz, un generador de informes, un evaluador de datos y un chat en línea.

Diagrama de secuencia de interacción del usuario

En la figura se muestra un diagrama de secuencia basado en la interacción entre los usuarios y entre éstos y los componentes de la interfaz de usuario:

La secuencia de interacción se desarrolla en cuatro pasos:

  1. Un político (PoliticianRole) inicia la tarea cooperativa.El político necesita dos evaluaciones, una por parte de un experto en SIG que realiza una evaluación técnica, y la otra una evaluación económica basada en la evaluación técnica.
  2. Hay un técnico SIG (ExpertGISRole) que se encarga de analizar las zonas afectadas para clasificar los tipos de suelo, las infraestructuras dañadas, el tamaño de cada zona afectada, etc.
  3. Existe un administrador (EvaluatorRole) que realiza una estimación económica del suelo afectado, infraestructuras dañadas, etc. en base a la información proporcionada por el experto.
  4. Finalmente, el político realiza su informe final en base a la información elaborada y coordinada en el proceso cooperativo descrito anteriormente.

Metamodelo de arquitectura

La siguiente figura muestra el meta-modelo de arquitectura propuesto con sus tres partes:

  • (a) Sección de interacción del meta-modelo (IM)
  • (b) Sección del metamodelo de estructura (SM)
  • (c) Sección del meta-modelo visual (VM)

La interacción modela grupos de actores y sus protocolos de interacción a través de actividades y tareas. La estructura de la interfaz de usuario se modela mediante componentes, puertos y conectores. El metamodelo visual se describe mediante una máquina de estados.

architecture_metamodel.ecore

<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="architecture_metamodel"
nsURI="http://architecture_metamodel/1.0" nsPrefix="architecture_metamodel">
<eClassifiers xsi:type="ecore:EClass" name="ArchitectureModel" eSuperTypes="#//ComplexComponent">
<eStructuralFeatures xsi:type="ecore:EReference" name="interfaces" upperBound="-1"
eType="#//Interface" containment="true" eOpposite="#//Interface/parent" />
<eStructuralFeatures xsi:type="ecore:EReference" name="events" upperBound="-1"
eType="#//Event" containment="true" eOpposite="#//Event/parent" />
<eStructuralFeatures xsi:type="ecore:EReference" name="currentEvent" eType="#//Event" />
<eStructuralFeatures xsi:type="ecore:EReference" name="definitions" upperBound="-1"
eType="#//SimpleComponentDefinition" containment="true" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Interface">
<eStructuralFeatures xsi:type="ecore:EReference" name="services" lowerBound="1"
upperBound="-1" eType="#//Services" containment="true" eOpposite="#//Services/parent" />
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" lowerBound="1"
eType="#//ArchitectureModel" eOpposite="#//ArchitectureModel/interfaces" />
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Event" abstract="true">
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" lowerBound="1"
eType="#//ArchitectureModel" eOpposite="#//ArchitectureModel/events" />
<eStructuralFeatures xsi:type="ecore:EReference" name="eventTransition" upperBound="-1"
eType="#//Transition" eOpposite="#//Transition/transitionEvent" />
<eStructuralFeatures xsi:type="ecore:EReference" name="eventLaunched" upperBound="-1"
eType="#//LaunchEvent" eOpposite="#//LaunchEvent/launchedEvent" />
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="SimpleEvent" eSuperTypes="#//Event" />
<eClassifiers xsi:type="ecore:EClass" name="ComplexEvent" eSuperTypes="#//Event">
<eStructuralFeatures xsi:type="ecore:EReference" name="subEvents" upperBound="-1"
eType="#//Event" containment="true" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ComplexComponent" eSuperTypes="#//Component">
<eStructuralFeatures xsi:type="ecore:EReference" name="subComponents" upperBound="-1"
eType="#//Component" containment="true" eOpposite="#//Component/parent" />
<eStructuralFeatures xsi:type="ecore:EReference" name="connectors" upperBound="-1"
eType="#//Connector" containment="true" eOpposite="#//Connector/parent" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Component" abstract="true">
<eStructuralFeatures xsi:type="ecore:EReference" name="ports" lowerBound="1" upperBound="-1"
eType="#//Port" containment="true" eOpposite="#//Port/parent" />
<eStructuralFeatures xsi:type="ecore:EReference" name="visualBehaviour"
eType="#//VisualBehaviourSM"
containment="true" eOpposite="#//VisualBehaviourSM/parent" />
<eStructuralFeatures xsi:type="ecore:EReference" name="interactionBehaviour"
eType="#//InteractionBehaviourSM"
containment="true" eOpposite="#//InteractionBehaviourSM/parent" />
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" eType="#//ComplexComponent"
eOpposite="#//ComplexComponent/subComponents" />
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="SimpleComponent" eSuperTypes="#//Component">
<eStructuralFeatures xsi:type="ecore:EReference" name="definition" lowerBound="1"
eType="#//SimpleComponentDefinition" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Connector">
<eStructuralFeatures xsi:type="ecore:EReference" name="source" lowerBound="1"
eType="#//Provided" />
<eStructuralFeatures xsi:type="ecore:EReference" name="target" lowerBound="1"
eType="#//Required" />
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" lowerBound="1"
eType="#//ComplexComponent" eOpposite="#//ComplexComponent/connectors" />
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Port" abstract="true">
<eStructuralFeatures xsi:type="ecore:EReference" name="port_interface" lowerBound="1"
eType="#//Interface" />
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" lowerBound="1"
eType="#//Component" eOpposite="#//Component/ports" />
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Provided" eSuperTypes="#//Port" />
<eClassifiers xsi:type="ecore:EClass" name="Required" eSuperTypes="#//Port" />
<eClassifiers xsi:type="ecore:EClass" name="StateMachine" abstract="true">
<eStructuralFeatures xsi:type="ecore:EReference" name="regions" lowerBound="1"
upperBound="-1" eType="#//Region" containment="true" eOpposite="#//Region/smParent" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Transition">
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" lowerBound="1"
eType="#//Region" eOpposite="#//Region/transitions" />
<eStructuralFeatures xsi:type="ecore:EReference" name="source" lowerBound="1"
eType="#//Vertex" eOpposite="#//Vertex/outgoing" />
<eStructuralFeatures xsi:type="ecore:EReference" name="target" lowerBound="1"
eType="#//Vertex" eOpposite="#//Vertex/incoming" />
<eStructuralFeatures xsi:type="ecore:EReference" name="transitionEvent" eType="#//Event"
eOpposite="#//Event/eventTransition" />
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="State" eSuperTypes="#//Vertex">
<eStructuralFeatures xsi:type="ecore:EReference" name="subRegions" upperBound="-1"
eType="#//Region" containment="true" eOpposite="#//Region/stateParent" />
<eStructuralFeatures xsi:type="ecore:EReference" name="componentActivity" lowerBound="1"
eType="#//ComponentActivity" containment="true" eOpposite="#//ComponentActivity/parent" />
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="VisualBehaviourSM" eSuperTypes="#//StateMachine">
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" lowerBound="1"
eType="#//Component" eOpposite="#//Component/visualBehaviour" />
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="InteractionBehaviourSM"
eSuperTypes="#//StateMachine">
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" lowerBound="1"
eType="#//Component" eOpposite="#//Component/interactionBehaviour" />
<eStructuralFeatures xsi:type="ecore:EReference" name="interactionActivity" lowerBound="1"
eType="#//InteractionActivity" containment="true" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Services">
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" lowerBound="1"
eType="#//Interface" eOpposite="#//Interface/services" />
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Vertex" abstract="true">
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" lowerBound="1"
eType="#//Region" eOpposite="#//Region/vertex" />
<eStructuralFeatures xsi:type="ecore:EReference" name="incoming" upperBound="-1"
eType="#//Transition" eOpposite="#//Transition/target" />
<eStructuralFeatures xsi:type="ecore:EReference" name="outgoing" upperBound="-1"
eType="#//Transition" eOpposite="#//Transition/source" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Pseudostate" abstract="true" eSuperTypes="#//Vertex" />
<eClassifiers xsi:type="ecore:EClass" name="ComponentActivity">
<eStructuralFeatures xsi:type="ecore:EReference" name="actions" lowerBound="1"
upperBound="-1" eType="#//ComponentAction" containment="true"
eOpposite="#//ComponentAction/parent" />
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" lowerBound="1"
eType="#//State" eOpposite="#//State/componentActivity" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="ComponentAction">
<eStructuralFeatures xsi:type="ecore:EReference" name="parent" lowerBound="1"
eType="#//ComponentActivity" eOpposite="#//ComponentActivity/actions" />
<eStructuralFeatures xsi:type="ecore:EAttribute" name="parameters"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Create" eSuperTypes="#//ComponentAction">
<eStructuralFeatures xsi:type="ecore:EReference" name="sourceComponent" lowerBound="1"
eType="#//SimpleComponentDefinition" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Delete" eSuperTypes="#//ComponentAction" />
<eClassifiers xsi:type="ecore:EClass" name="Activate" eSuperTypes="#//ComponentAction" />
<eClassifiers xsi:type="ecore:EClass" name="ExecuteService" eSuperTypes="#//ComponentAction">
<eStructuralFeatures xsi:type="ecore:EReference" name="serivce" lowerBound="1"
eType="#//Services" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="LaunchEvent" eSuperTypes="#//ComponentAction">
<eStructuralFeatures xsi:type="ecore:EReference" name="launchComponent" eType="#//Component" />
<eStructuralFeatures xsi:type="ecore:EReference" name="launchedEvent" lowerBound="1"
eType="#//Event" eOpposite="#//Event/eventLaunched" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Region">
<eStructuralFeatures xsi:type="ecore:EReference" name="smParent" lowerBound="1"
eType="#//StateMachine" eOpposite="#//StateMachine/regions" />
<eStructuralFeatures xsi:type="ecore:EReference" name="transitions" upperBound="-1"
eType="#//Transition" containment="true" eOpposite="#//Transition/parent" />
<eStructuralFeatures xsi:type="ecore:EReference" name="vertex" lowerBound="1"
upperBound="-1" eType="#//Vertex" containment="true" eOpposite="#//Vertex/parent" />
<eStructuralFeatures xsi:type="ecore:EReference" name="stateParent" eType="#//State"
eOpposite="#//State/subRegions" />
<eStructuralFeatures xsi:type="ecore:EReference" name="currentState" lowerBound="1"
eType="#//State" />
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" />
<eStructuralFeatures xsi:type="ecore:EAttribute" name="update" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" />
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="InitialState" eSuperTypes="#//Pseudostate" />
<eClassifiers xsi:type="ecore:EClass" name="JoinState" eSuperTypes="#//Pseudostate" />
<eClassifiers xsi:type="ecore:EClass" name="ForkState" eSuperTypes="#//Pseudostate" />
<eClassifiers xsi:type="ecore:EClass" name="FinalState" eSuperTypes="#//Pseudostate" />
<eClassifiers xsi:type="ecore:EClass" name="InteractionActivity" />
<eClassifiers xsi:type="ecore:EClass" name="Deactivate" eSuperTypes="#//ComponentAction" />
<eClassifiers xsi:type="ecore:EClass" name="SimpleComponentDefinition">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString" />
</eClassifiers>
</ecore:EPackage>

Subconjunto de interacción

La siguiente figura muestra un diagrama que describe las relaciones entre usuarios, así como sus actividades para la ejecución cooperativa de tareas. La figura muestra una instancia (o modelo) del metamodelo de interacción como ejemplo orientativo. Para dibujar el modelo hemos utilizado una representación adaptada del diagrama de actividades UML. Para facilitar su lectura, cada símbolo se ha estereotipado con el concepto (elemento) correspondiente en el metamodelo.

Como resultado del proceso de modelado, hemos obtenido el siguiente modelo de interacción:

interaction_model_example.xmi

<?xml version="1.0" encoding="ASCII"?>
<interaction_mm:InteractionModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:interaction_mm="http://interaction_mm/1.0" xsi:schemaLocation="http://interaction_mm/1.0 ../interaction_mm.ecore" name="example_model">
<role isPlayed="//@group.0 //@group.0/@actor.0" name="Politic">
<task xsi:type="interaction_mm:CooperativeTask" name="DamageEvaluationP">
<taskUnit xsi:type="interaction_mm:TaskAction" name="InputData"/>
<taskUnit xsi:type="interaction_mm:SubTask" name="GeographicAnalysis">
<choreography id="ch_p_2">
<step xsi:type="interaction_mm:ControlStep" controlFlow="//@role.0/@task.0/@taskUnit.1/@choreography/@step.1" id="step_p_2_1"/>
<step xsi:type="interaction_mm:TaskStep" controlFlow="//@role.0/@task.0/@taskUnit.1/@choreography/@step.2" id="step_p_2_2" task="//@role.1/@task.0"/>
<step xsi:type="interaction_mm:TaskUnitStep" controlFlow="//@role.0/@task.0/@taskUnit.1/@choreography/@step.3" id="step_p_2_3" taskUnit="//@role.0/@task.0/@taskUnit.1/@subTaskUnit.0"/>
<step xsi:type="interaction_mm:TaskUnitStep" id="step_p_2_4" taskUnit="//@role.0/@task.0/@taskUnit.1/@subTaskUnit.1"/>
<step xsi:type="interaction_mm:ControlStep" id="step_p_2_5" type="FinalStep"/>
</choreography>
<subTaskUnit xsi:type="interaction_mm:TaskAction" objectFlow="//@role.0/@task.0/@infoObject.0" name="SendAnalysisData"/>
<subTaskUnit xsi:type="interaction_mm:TaskAction" objectFlow="//@role.0/@task.0/@infoObject.1" name="ReceiveAnalysisInformation"/>
</taskUnit>
<taskUnit xsi:type="interaction_mm:SubTask" name="Evaluation">
<choreography id="ch_p_3">
<step xsi:type="interaction_mm:ControlStep" controlFlow="//@role.0/@task.0/@taskUnit.2/@choreography/@step.1" id="step_p_3_1"/>
<step xsi:type="interaction_mm:TaskStep" controlFlow="//@role.0/@task.0/@taskUnit.2/@choreography/@step.2" id="step_p_3_2" task="//@role.2/@task.0"/>
<step xsi:type="interaction_mm:TaskUnitStep" controlFlow="//@role.0/@task.0/@taskUnit.2/@choreography/@step.3" id="step_p_3_3" taskUnit="//@role.0/@task.0/@taskUnit.2/@subTaskUnit.0"/>
<step xsi:type="interaction_mm:TaskUnitStep" id="step_p_3_4" taskUnit="//@role.0/@task.0/@taskUnit.2/@subTaskUnit.1"/>
<step xsi:type="interaction_mm:ControlStep" id="step_p_3_5" type="FinalStep"/>
</choreography>
<subTaskUnit xsi:type="interaction_mm:TaskAction" objectFlow="//@role.0/@task.0/@infoObject.2 //@role.0/@task.0/@infoObject.1" name="SendEvaluationData"/>
<subTaskUnit xsi:type="interaction_mm:TaskAction" objectFlow="//@role.0/@task.0/@infoObject.3" name="ReceiveEvaluationReport"/>
</taskUnit>
<choreography id="ch_p_1">
<step xsi:type="interaction_mm:ControlStep" controlFlow="//@role.0/@task.0/@choreography/@step.1" id="step_p_1_1"/>
<step xsi:type="interaction_mm:TaskUnitStep" id="step_p_1_2" taskUnit="//@role.0/@task.0/@taskUnit.0"/>
<step xsi:type="interaction_mm:ControlStep" controlFlow="//@role.0/@task.0/@choreography/@step.3 //@role.0/@task.0/@choreography/@step.4" id="step_p_1_3" type="ForkStep"/>
<step xsi:type="interaction_mm:TaskUnitStep" id="step_p_1_4" taskUnit="//@role.0/@task.0/@taskUnit.1"/>
<step xsi:type="interaction_mm:TaskUnitStep" id="step_p_1_5" taskUnit="//@role.0/@task.0/@taskUnit.2"/>
<step xsi:type="interaction_mm:ControlStep" id="step_p_1_6" type="JoinStep"/>
<step xsi:type="interaction_mm:ControlStep" id="step_p_1_7" type="FinalStep"/>
</choreography>
<infoObject name="AnalysisData"/>
<infoObject name="AnalysisInformation"/>
<infoObject name="EvaluationData"/>
<infoObject name="EvaluationReport"/>
</task>
</role>
<role isPlayed="//@group.0/@actor.1" name="ExpertGIS">
<task xsi:type="interaction_mm:NonCooperativeTask" name="DamageEvaluationExp">
<taskUnit xsi:type="interaction_mm:TaskAction" objectFlow="//@role.0/@task.0/@infoObject.0" name="ReceiveDataExp"/>
<taskUnit xsi:type="interaction_mm:TaskAction" name="AnalysisGIS"/>
<taskUnit xsi:type="interaction_mm:TaskAction" objectFlow="//@role.0/@task.0/@infoObject.1" name="SendInformation"/>
<choreography id="ch_exp_1">
<step xsi:type="interaction_mm:ControlStep" controlFlow="//@role.1/@task.0/@choreography/@step.1" id="step_exp_1_1"/>
<step xsi:type="interaction_mm:TaskUnitStep" controlFlow="//@role.1/@task.0/@choreography/@step.2" id="step_exp_1_2" taskUnit="//@role.1/@task.0/@taskUnit.0"/>
<step xsi:type="interaction_mm:TaskUnitStep" controlFlow="//@role.1/@task.0/@choreography/@step.3" id="step_exp_1_3" taskUnit="//@role.1/@task.0/@taskUnit.1"/>
<step xsi:type="interaction_mm:TaskUnitStep" id="step_exp_1_4" taskUnit="//@role.1/@task.0/@taskUnit.2"/>
<step xsi:type="interaction_mm:ControlStep" id="step_exp_1_5" type="FinalStep"/>
</choreography>
</task>
</role>
<role isPlayed="//@group.0/@actor.2" name="Evaluator">
<task xsi:type="interaction_mm:NonCooperativeTask" name="DamageEvaluationEv">
<taskUnit xsi:type="interaction_mm:TaskAction" objectFlow="//@role.0/@task.0/@infoObject.2" name="ReceiveDataEv"/>
<taskUnit xsi:type="interaction_mm:TaskAction" name="Evaluation"/>
<taskUnit xsi:type="interaction_mm:TaskAction" objectFlow="//@role.0/@task.0/@infoObject.3" name="SendReport"/>
<choreography id="ch_ev_1">
<step xsi:type="interaction_mm:ControlStep" controlFlow="//@role.2/@task.0/@choreography/@step.1" id="step_ev_1_1"/>
<step xsi:type="interaction_mm:TaskUnitStep" controlFlow="//@role.2/@task.0/@choreography/@step.2" id="step_ev_1_2" taskUnit="//@role.2/@task.0/@taskUnit.0"/>
<step xsi:type="interaction_mm:TaskUnitStep" controlFlow="//@role.2/@task.0/@choreography/@step.3" id="step_ev_1_3" taskUnit="//@role.2/@task.0/@taskUnit.1"/>
<step xsi:type="interaction_mm:TaskUnitStep" id="step_ev_1_4" taskUnit="//@role.2/@task.0/@taskUnit.2"/>
<step xsi:type="interaction_mm:ControlStep" id="step_ev_1_5" type="FinalStep"/>
</choreography>
</task>
</role>
<group plays="//@role.0" name="Politic1" id="Group1">
<actor plays="//@role.0" name="Politic1"/>
<actor plays="//@role.1" name="ExpertGIS1"/>
<actor plays="//@role.2" name="Evaluator1"/>
</group>
</interaction_mm:InteractionModel>

Subconjunto estructural

Esta figura muestra una instancia del metamodelo de estructura para el ejemplo. A continuación, el modelo muestra las tres interfaces de usuario para los tres actores del ejemplo, una para el político, otra para el experto en SIG y otra para el evaluador. El diagrama muestra las dependencias internas entre los componentes de cada interfaz de usuario y también entre los componentes de la interfaz. Se utilizó un diagrama de componentes UML para dibujar el modelo de la instancia de la gura, utilizando una notación gráfica para el modelo " capsule/port/connector ".

Como resultado del proceso de modelado, hemos obtenido el siguiente modelo de arquitectura:

architecture_model_example.xmi

<?xml version="1.0" encoding="ASCII"?>
<architecture_metamodel:ArchitectureModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:architecture_metamodel="http://architecture_metamodel/1.0"
xsi:schemaLocation="http://architecture_metamodel/1.0 architecture_metamodel.ecore"
name="ExampleModel">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.3" name="out_am" />
<subComponents xsi:type="architecture_metamodel:ComplexComponent" name="Politician_GUI">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.0"
name="out_politicianGui" />
<ports xsi:type="architecture_metamodel:Required" port_interface="//@interfaces.1"
name="in_politicianGui_expertGui" />
<ports xsi:type="architecture_metamodel:Required" port_interface="//@interfaces.2"
name="in_politicianGui_evaluatorGui" />
<subComponents xsi:type="architecture_metamodel:SimpleComponent" name="ReportManager"
definition="//@definitions.0">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.4"
name="out_reportManager" />
</subComponents>
<subComponents xsi:type="architecture_metamodel:SimpleComponent" name="DataManager"
definition="//@definitions.1">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.5"
name="out_dataManager" />
</subComponents>
</subComponents>
<subComponents xsi:type="architecture_metamodel:ComplexComponent" name="ExpertGIS_GUI">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.1"
name="out_expertGui" />
<subComponents xsi:type="architecture_metamodel:ComplexComponent" name="ImageVisualization">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.6"
name="out_imageVisualization" />
<subComponents xsi:type="architecture_metamodel:SimpleComponent" name="Map"
definition="//@definitions.2">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.7"
name="out_map" />
</subComponents>
<subComponents xsi:type="architecture_metamodel:SimpleComponent" name="Histogram"
definition="//@definitions.3">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.8"
name="out_hist" />
<ports xsi:type="architecture_metamodel:Required" port_interface="//@interfaces.7"
name="in_hist_map" />
</subComponents>
<connectors source="//@subComponents.1/@subComponents.0/@subComponents.0/@ports.0"
target="//@subComponents.1/@subComponents.0/@subComponents.1/@ports.1"
name="map_hist" />
</subComponents>
<subComponents xsi:type="architecture_metamodel:SimpleComponent" name="ReportCreator"
definition="//@definitions.4">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.9"
name="out_reportCreator" />
</subComponents>
<subComponents xsi:type="architecture_metamodel:SimpleComponent" name="Chat"
definition="//@definitions.5">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.10"
name="out_chat" />
</subComponents>
</subComponents>
<subComponents xsi:type="architecture_metamodel:ComplexComponent" name="Evaluator_GUI">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.2"
name="out_evaluatorGui" />
<subComponents xsi:type="architecture_metamodel:ComplexComponent" name="DamageEvaluator">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.11"
name="out_damageEvaluator" />
<subComponents xsi:type="architecture_metamodel:SimpleComponent" name="EconomicAssessor"
definition="//@definitions.6">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.12"
name="out_economicAssessor" />
<ports xsi:type="architecture_metamodel:Required" port_interface="//@interfaces.13"
name="in_economicAssessor_dataConversor" />
<ports xsi:type="architecture_metamodel:Required" port_interface="//@interfaces.14"
name="in_economicAssessor_calculator" />
</subComponents>
<subComponents xsi:type="architecture_metamodel:SimpleComponent" name="DataConversor"
definition="//@definitions.7">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.13"
name="out_dataConversor" />
</subComponents>
<subComponents xsi:type="architecture_metamodel:SimpleComponent" name="Calculator"
definition="//@definitions.8">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.14"
name="out_calculator" />
</subComponents>
<connectors source="//@subComponents.2/@subComponents.0/@subComponents.1/@ports.0"
target="//@subComponents.2/@subComponents.0/@subComponents.0/@ports.1"
name="dataConversor_economicAssessor" />
<connectors source="//@subComponents.2/@subComponents.0/@subComponents.2/@ports.0"
target="//@subComponents.2/@subComponents.0/@subComponents.0/@ports.2"
name="calculator_economicAssessor" />
</subComponents>
<subComponents xsi:type="architecture_metamodel:SimpleComponent" name="ReportCreator"
definition="//@definitions.4">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.9"
name="out_reportCreator" />
</subComponents>
<subComponents xsi:type="architecture_metamodel:SimpleComponent" name="Chat"
definition="//@definitions.5">
<ports xsi:type="architecture_metamodel:Provided" port_interface="//@interfaces.10"
name="out_chat" />
</subComponents>
</subComponents>
<connectors source="//@subComponents.1/@ports.0" target="//@subComponents.0/@ports.1"
name="expertGui_politicianGui" />
<connectors source="//@subComponents.2/@ports.0" target="//@subComponents.0/@ports.2"
name="evaluatorGui_politicianGui" />
<interfaces name="R_DmgEvPolitician">
<services name="R_DmgEvPolitician" />
</interfaces>
<interfaces name="R_DmgEvExpertGIS">
<services name="R_DmgEvExpertGIS" />
</interfaces>
<interfaces name="R_DmgEvEvaluator">
<services name="R_DmgEvEvaluator" />
</interfaces>
<interfaces name="R_AM">
<services name="R_AM" />
</interfaces>
<interfaces name="R_ReportM">
<services name="R_ReportM" />
</interfaces>
<interfaces name="R_DataM">
<services name="R_DataM" />
</interfaces>
<interfaces name="R_ImgVis">
<services name="R_ImgVis" />
</interfaces>
<interfaces name="R_Map">
<services name="R_Map" />
</interfaces>
<interfaces name="R_Hist">
<services name="R_Hist" />
</interfaces>
<interfaces name="R_ReportC">
<services name="R_ReportC" />
</interfaces>
<interfaces name="R_Chat">
<services name="R_Chat" />
</interfaces>
<interfaces name="R_DmgEv">
<services name="R_DmgEv" />
</interfaces>
<interfaces name="R_EconomicAssess">
<services name="R_EconomicAssess" />
</interfaces>
<interfaces name="R_DataConv">
<services name="R_DataConv" />
</interfaces>
<interfaces name="R_Calc">
<services name="R_Calc" />
</interfaces>
<definitions name="ReportManager" />
<definitions name="DataManager" />
<definitions name="Map" />
<definitions name="Histogram" />
<definitions name="ReportCreator" />
<definitions name="Chat" />
<definitions name="EconomicAssessor" />
<definitions name="DataConversor" />
<definitions name="Calculator" />
</architecture_metamodel:ArchitectureModel>