La extensión de publicación cuando arranca obtiene el controlador (*IPublishController*) del servidor seleccionado y que previamente registró en el registro de controladores (*ControllersRegister*). De este controlador obtiene una vista de publicación (*IPublishView*) que mostrará en la ventana principal. Previamente la extensión de publicación (realmente el controlador principal de extPublish *MainController*) ha obtenido una publicación desde la persistencia que se la pasa al controlador del servidor para que inicialice la vista con los elementos correspondientes. Cuando el usuario pulse el botón "publicar" de la ventana principal (*MainWindow*), el controlador principal obtendrá el modelo modificado por el usuario para invocar su método *publish()*.
.. figure:: ../../main_images/gui_images/gui_design_classes.png
:scale: 50
:alt: Fallo al cargar la imagen
:align: center
Clases de diseño del subsistema gui
**IPublishController**
Interfaz que debe implementar cualquier controlador de servidor. La responsabilidades de un controlador son las de crear una vista del modelo (de *Publication*) y la de recibir los eventos del usuario realizados en la vista.
*Operaciones*
*getModel():Object* Obtenemos el modelo que controla y que ha sido modificado por el usuario.
*setModel(model:Object)* Pasamos el modelo para que lo muestre en su vista
*getView():PublishView* Obtenemos la vista asociada al controlador
NOTA:Quizás sea mejor que devuelva un IPublishView
**IPublishView**
Interfaz que debe implementar cualquier vista de un modelo (publication,server, service, remoteResource).
Las responsabilidades de una vista de publicación son las de mostrar al usuario un estado del modelo.
*Operaciones*
*getModel():Object* Obtenemos el modelo que muestra dicha vista.
*setModel(model:Object)* Pasamos el modelo para que lo muestre al usuario.
**PublishView**
JPanel que implementa IPublishView
**PublishController**
Quizás esta clase no haga falta
**ControllerRegister**
Registro de controladores. Cualquier plugin debe registrar aquí su controlador.
*Operaciones*
*addController(key_controller:String, clase:Class)* Registramos el controlador identificado por la cadena "key_controller"
*getControllersNames():Set* Obtenemos los identificadores de todos los controladores registrados
*getInstance(key_controller:String, clase:Class)* Obtengo una instancia del controlador especificado