Mat|r permite integrar tu aplicación con otras aplicaciones (que también han sido creadas en Mat|r) llamadas librerías, de manera rápida y sencilla, pudiendo usar código escrito por otras personas o incluso tu mismo. De esta manera el desarrollador tiene la posibilidad de compartir y reutilizar librerías ahorrando tiempo de desarrollo, y algo no menos importante, agregando valor a la comunidad Mat|r.

Contenido

Creación de una aplicación Mat|r como librería

Para crear una aplicación en forma de libreria, al momento de la creación de la aplicación, debemos seleccionar afirmativamente la opción “Can this app be imported?”.
También debemos establecer un package name que será usado al momento de importar la librería.

Luego se procede a desarrollar la aplicación de manera normal. En nuestro ejemplo, crearemos una librería llamada OAuthFacebookLib, que tendrá como objetivo la autenticación del usuario en facebook. El código de la librería seria el siguiente:

Model FacebookUser{
    String nombre
}

Application{

    String tokenOAuth
    FacebookUser usuario
    OnInit{       
        tokenOAuth = ""
    }
}

RuleContext LibraryContext {

    Rule login {

      OAuth fbOAuth = OAuth()
      //clientID y secret: son campos autogenerados por facebook
      fbOAuth.clientID = "110429725963xxxx"
      fbOAuth.secret = "8fc0392d9624db955147d36e26xxxxxx"

      //accountName: campo utilizar internamente por mat|r como clave al persistir la info de sesion
      fbOAuth.accountName = "MyAccountFacebook"

      //authorizationURL y tokenURL: son provistas en la documentacion de la Facebook API
      //observar debe tener en cuenta la version de la api a conectarse que se informa en la pagina de configuracion de la apliacion facebook
      fbOAuth.authorizationURL = "https://www.facebook.com/v2.9/dialog/oauth?scope=email"
      fbOAuth.tokenURL = "https://graph.facebook.com/v2.9/oauth/access_token"

      //redirectURL: aqui se debe ingresar una URL propia a utilizar para la redireccion que indica el protocolo
      fbOAuth.redirectURL = "http://mywebpage/auth/callback"

      //Se efectua la llamada y en caso de exito se obtiene el token valido
      tokenOAuth = broker.oauth.authenticate(fbOAuth)

      //una vez autorizado, se puede utilizar la variable oauthToken para las llamadas a otros endpoints de facebook que requieran dicho token
      usuario = FacebookUser()
      usuario.nombre = "Juan Perez"
      ...
      ...
    }
}

En el código anterior, definimos una regla llamada login, que será la encargada de la autenticación del usuario en facebook y guardará el token resultante en la variable global tokenOAuth.

Para que la librería tenga visibilidad para los demás usuarios de la plataforma Mat|r, ésta tiene que ser desplegada a través de la pestaña Deploy y haciendo click en el botón Publish veremos que aparece un código QR con la nueva versión desplegada.

Sentencia de importación de una librería

Una vez que ya tenemos la librería terminada y desplegada, procedemos a importarla desde nuestra aplicación. Esto puede llevarse a cabo de dos diferentes maneras:

  1. Especificando la versión de la libreria que se quiere importar:
      Import packageNameDeLaLibreria, version as aliasLibreria
    

    en nuestro ejemplo:

      Import OAuthFacebookLib, 0.7 as facebookOAuth
    
  2. Sin especificar la versión de la librería que se quiere importar, asumiendo que se importará la última versión que ha sido desplegada:
      Import packageNameDeLaLibreria as aliasLibreria
    

    en nuestro ejemplo:

      Import OAuthFacebookLib as facebookOAuth
    

    Cuando se detecte una nueva versión desplegada disponible, se mostrará en la visualización de la librería desde el panel derecho, el icono de Refrescar. Presionando este botón se podrá actualizar el código a la ultima versión disponible. Cabe destacar que este proceso de actualización no alcanza a los layouts, que necesitan ser actualizados individualmente.

Como podemos observar en la sentencia de importación, debemos establecer un alias para la libreria (lo que sigue luego de la palabra as), que necesitaremos para acceder a los elementos de librería.

Una vez que ya tenemos la librería importada en nuestra aplicación, podemos observar en el panel derecho de la pantalla que la librería ha sido importada correctamente, y haciendo click en la misma, podremos observar cada uno de los elementos importados:

  • Modelos
  • Variables globales
  • Layouts
  • Rule contexts
  • Endpoints
  • Módulos y Funciones

Importación por Elementos

En mat|r script también podemos realizar la importación de una parte de una librería sin necesidad de importarla completamente. A esto lo llamamos importación de un elemento. Los elementos que podemos importar son los listados anteriormente.
La importación de un elemento se realiza a través de alguna de las siguientes sentencias:

  1. Especificando la versión de la libreria que se quiere importar:
      Import packageNameDeLaLibreria.nombreElemento, version as aliasLibreria
    

    Importamos el modelo de nuestro ejemplo:

      Import OAuthFacebookLib.FacebookUser, 0.7 as facebookOAuth
    
  2. Sin especificar la versión de la librería que se quiere importar, asumiendo que se importará la última versión que ha sido desplegada:
      Import packageNameDeLaLibreria.nombreElemento as aliasLibreria
    

    Importamos el modelo de nuestro ejemplo:

      Import OAuthFacebookLib.FacebookUser as facebookOAuth
    

Acceso a los elementos importados desde una librería

Para hacer uso de los elementos de la librería, utilizamos el alias que definimos en la sentencia de importación, seguido de dos puntos (::), de la siguiente manera:

aliasLibreria::nombreModelo

aliasLibreria::variableGlobal

aliasLibreria::nombreLayout

aliasLibreria::nombreRuleContext.nombreRegla

aliasLibreria::nombreEndPoint

aliasLibreria::nombreModulo.nombreFuncion()

Ademas, existe la posibilidad de inicializar la librería (es decir llamar a su método OnInit) en el caso que la misma necesite establecer ciertos valores antes de empezar a ser usada. Para esto utilizamos una función del core llamada initialize, como se muestra a continuación:

    broker.core.initialize("aliasLibreria")

o en nuestro ejemplo:

    broker.core.initialize("facebookOAuth")

Ejemplo de aplicación que importa una librería

Continuando con nuestro ejemplo, crearemos la aplicación que importará la librería facebookOAuth, y haremos uso de las siguientes sentencias:

  1. Configuración de Decision con regla importada:
    Decision btn2 action("facebookOAuth::LibraryContext.login") label("LOGIN")
    

    Con esta linea, estamos definiendo un botón con título ‘LOGIN’ que al presionarlo llamará a la regla login especificada en la librería facebookOAuth, en el contexto propio de la librería LibraryContext.

  2. Acceso a variable global
    broker.ui.showAlert("token", facebookOAuth::tokenOAuth)
    

    Esta sentencia mostrará en un cuadro de diálogo el token que fue seteado en la variable global de la librería tokenOAuth al presionar el botón definido anteriormente.

  3. Instanciación de modelo importado
    facebookOAuth::User localUser = facebookOAuth::User()
    

    Esta línea indica como crear una nueva instancia de un modelo definido en la librería, en nuestra aplicación, asignando la instancia en la variable local localUser.

El código completo, queda de la siguiente manera:

Import OAuthFacebookLib, 0.7 as facebookOAuth

Experience Main{
    Decision btnLogin action("facebookOAuth::LibraryContext.login") label("LOGIN")
    Decision btnShow action("ApplicationContext.showToken") label("SHOW TOKEN")
}

Application {
    Main m
    OnInit {
        m = Main()
        broker.ui.push("Main", m)

        try {
            broker.core.initialize("facebookOAuth")
        } catch (e){
            broker.ui.showAlert("error","can't initialize lib" + e.reason())
        }
    }
}

RuleContext ApplicationContext{

    Rule showToken{
        broker.ui.showAlert("token", facebookOAuth::tokenOAuth)
    }

    Rule ruleUtilizarModelosImportados {

        //Definimos una variable local del tipo del modelo importado
        facebookOAuth::User localUser

        //Asiganmos la variable global que apunta al usuario logueado, en nuestra variable local localUser
        localUser = facebookOAuth::usuario

        //o si queremos crear una nueva instancia, utilizamos la sentencia:
        localUser = facebookOAuth::User()
        ...
        ...
    }
}