Explicación de los Elementos del Diagrama

Propuesta de diseño para el modelo de Gadgets usado por la Paleta, el Dragboard, el módulo de Wiring y de persistencia.

Gadget. Clase/Objeto de definición de Gadget IGadgetClase/Objeto de interacción con Gadget. Gadget 1:N IGadget

XHtml. Objeto que define el comportamiento del gadget (su código) Template. Objeto que define el comportamiento dinámico de un Gadget (su template).

Ambos dos (XHtml y Template) deben ser persistentes de modo que, una vez incluidos en el sistema, la plataforma pueda acceder a ellos, y reconstruir un Gadget, sin necesidad de acceder a sus URIS originales.

IGadget Objetos no persistentes, se regeneraran a partir de la información presente en el resto de los componentes

El Wire Model anda por ahi... pero no es algo muy centrado aun. Hay que mirar su relación con IGadgetConfig donde se almacena la información modificable en ejecución y persistente de un gadget (propiedades, estado,...¿wiring?)

A continuación tenéis una versión un poco más detallada del modelo de objetos. Evidentemente aún está incompleta (hay muchas cosas a tener en cuenta) y debemos colaborar entre todos para que todo vaya encajando y cobre sentido:

Librería de Objetos JS

Los métodos de los objetos que empiezan por _, son privados

Gadget

  • Representa el comportamiento común que comparten todas las instancias del mismo gadget.
  • Se emplea para solventar el problema de las intancias múltiples.
  • Todas las instancias de un mismo gadget comparten el padre y, por lo tanto, comparten el mismo código.
  • Lógicamente, cada IGadget tendrá un contexto de ejecución diferente (OO)
  • Cuando se crea un objeto Gadget, el constructor del objeto se encarga de cargar en el HTML de la plataforma de mash-up una etiqueta <script> que contendrá el id del modulo y el código de ejecución del gadget.
  • Cuando se elimina un objeto Gadget, se debe comprobar si quedan instancias. Si no quedan, se elimina el objeto. Si quedan, no se puede eliminar el objeto y con ello, la etiqueta <script>
  • Un objeto Gadget controla el ciclo de vida de un clase de gadget. En concreto, proporciona el siguiente API:
   delete()
   reload() (actualizar un gadget desde una nueva versión en Internet) // Es realmente necesario?? un gadget 
                                                                       // con un número de versión distinto es un nuevo gadget en la paleta...
   persist() // Creo que esto ya no hace falta pues que lo lleva directamente el Dragboard
   _init() 

IGadget

  • Permite resolver el problema de las multi-instancias de un mismo gadget de una forma OO.
  • Cada IGadget es una instancia de un gadget. Si hay multiples instancias, existirán multiples objetos IGadget con el mismo Gadget.
  • Un objeto IGadget está vinculado con un objeto Gadget. Es decir, un IGadget recibe en su constructor un Gadget.
  • Un objeto IGadget controla el ciclo de vida de la interracción de una instancia de gadget. En concreto, proporciona el siguiente API:
   allocate(int top, int left). Coloca un gaget en la pantalla
   getID(). Devuelve el indicador de un gadget
   dropTo(int top, int left). Efecto drag&drop de un gadget (aquí iría código script.aculo.us)
   reload(). Reinicializa un gadget
   minimize(). Minimiza una instnacia
   maximize(). Maximiza una instancia
   showProperties(). Muestra las propiedades de una instancia // Innecesaria si las variables 
                                                              // las recupera el DragBoard a través de VarManager
   getWiringInfo(). Devuelve la información necesaria para representar el wiring de una instancia // Tampoco haría falta 
                                                                                                  // con el nuevo modelo de variables de R y RW
   _init()
   bindUIEvents()
    Resuelve el problema de las multiinstancias de un mismo gadget.

Caracterización del problema de las multiinstancias:

  • Contexto diferente para dos instancias distintas (se resuelve con la orientación a objetos)
  • Vincular un evento de usuario (por ejemplo, click de un usuario sobre un botón) con un método de una instancia de gadget en concreto

Implementando ambos requisitos, no es necesarios definir NI MACROS, NI NOMBRES DISTINTOS por gadget para el mismo codigo(al estilo, cargarBandeja144334.. cargarBandeja2333223)

Se evita tambien la duplicación de código cuando existen multipes instnacias del mismo gadget

Funcionamiento de bindUIEvents:

1. Definir de manera declarativa la tupla (elementoHTML, evento, métodoAInvocar). La forma más elegante es marcar el HTML del gadget.

     <input id="botonEnviar" type="button" ezweb:event="click" ezweb:method="enviarFormulario">

1. Gracias a esa meta-información, vincular el evento JavaScript? con el método de la instancia de gadget adecuado

        // Codigo del gadget donde define sus métodos
    	var gadgetMethods = { prueba: function () { alert(this.id); }, }
        
        // Constructor de la clase GadgetInstance
        this.methods = gadgetMethods;
        
        // Extracción de la metainformación del HTML
        element = $(elementID) // Para todo elemento, con ID, ezweb:event y ezweb:method, se hace lo siguiente
        elementEvent = 'click'; // click es un ejemplo, en verdad, se leería el contenido de ezweb:event
        elementMethod = 'prueba'; //ezweb:method
        
        // Sentencia que usa la API Event de Prototype para vincular un evento de usuario sobre un element HTML 
        // con un método de una instancia de gaget en concreto
        Event.observe(element, elementEvent, this.methods[elementMethod].bindAsEventListener(this));

Variable

  • Es la clase que modeliza todos los tipos de variables (event, slot, preference y persistence) que maneja el sistema y en particular los gadget (permite esconder algunos métodos peligrosos para los gadget)
  • Existen dos clases que particularizan este concepto, y que son las variables que se utilizarán directamente desde el gadget (éste no trabajará directamente con la clase Variable, ya que en OO sería una clase abstracta):
    • ReadOnlyVariable?
      • Representa las variables de sólo lectura (slot y preference)
      • Definen una función manejador que será ejecutada desde el VarManager cuando el valor de la variable sea modificado
    • ReadWriteVariable?
      • Representa las variables de escritura (event y persistence)
  • Cuando desde un gadget se cree una nueva instancia de cualquiera de las dos variables, se llamará al constructor del padre, que éste a su vez llevará a cabo el registro de la variable en el módulo VarManager.

NoRestrictedVariable?

  • Permite realizar cualquier operación de RW sobre cualquier variable.
  • Surge ante la necesidad de permitir un mayor acceso a las variables por parte del módulo VarManager (únicamente éste módulo utiliza esta clase), y de cara a protegerlas de los usos indebidos por parte de los gadget.

Palette

  • Gestiona una colección de objetos Gadget.
  • Crea objetos IGadget y los agrega al entorno operacional
  • Se creará un solo objeto Palette (aplicar patron Singleton). Sus métodos serían los siguientes:
   insertGadgetClass()
   deleteGadgetClass()
   updateGadgetClass()
   insertGadgetInstance(gadgetClass)
   tagGadget(tag)
   repaint()

Template

  • Contiene información acerca de las variables del gadget.
  • Es realmente necesario en el modelo de objetos?? dos posibles soluciones para obtener la informacion de las variables:
    1. Se elimina el objeto Template, y al añadir un GadgetClass? a la paleta se trata el código del template, obteniendo la información de las variables que se almacena en el VarManager
    2. Se deja el objeto Template, de manera que cuando se crea una variable en el código del gadget, ésta se registra en el VarManager y se accede en ese momento al Template para obtener la información asociada.

Attachments