Dynamic XSQL Java function binding

Java Code1

Dynamic XSQL Java function binding

Con esta funcionalidad es posible crear un nuevo tag de XSQL-SCRIPT en runtime y utilizar este tag o función dentro de un xsql-script.

  • Crear una nueva función o tag.
  • Sobrepasar un tag existente para actualizarlo o cambiar su funcionamiento.

Muchas veces los programadores nos encontramos con el problema de necesitar una nueva funcionalidad o extender la funcionalidad de un tag existente, con esta función el programador podrá crear un tag que le falte o podrá sobreescribir un tag existente como si fuera una actualización o un parche por algún bug.

Pasos para crear el nuevo tag.

  • Escribir la clase haciendola extender de XSQLScriptFuction.
  • Compilar la clase y colocarla en un directorio especifico del server.
  • Cargar la clase dentro de nuestro xsql-script.
  • Utilizar el tag dentro del xsql-script.

Escribir la clase haciendola extender de XSQLScriptFuction.

Por ejemplo si queremos escribir un sample que pase a mayúsculas el texto que le pasemos como parámetro, podríamos escribir la siguiente clase. Guardamos el fichero sample.java /home/jas/conf/functions/ en el server webStudio.

// webStudio script
import deister.webstudio.core.xsql.script.XSQLScriptRunner;
import deister.webstudio.core.xsql.script.XSQLScriptFunction;
import deister.webstudio.core.xsql.script.XSQLScriptException;
 
// dom
import org.w3c.dom.Element;
 
/**
* <sample name='a'/>
*
* Complie with:
*
* javac sample.java -cp ..\..\common\lib\webStudioCore.jar
*
* Simple function to return cdata text in uppercase
*/
public final class sample extends XSQLScriptFunction
{
    protected final static String[] ATTRIBUTES = null;
    protected final boolean  isTerminal() { return false; }
    protected final String[] getAttributes() { return ATTRIBUTES; }
 
   protected final Object process(XSQLScriptRunner program, Element el, int deep)
      throws XSQLScriptException
   {
     Object data    = program.__get1EvaluatedArguments(el, deep);
     if (data == null)
         return null;
     String text = program.__object2String(el, data);
     return text.toUpperCase();
   }
}

Compilar la clase y colocarla en un directorio especifico del server.

Ahora debemos compilar la clase, para ello ejecutamos en el server webStudio la siguiente sentencia

  cd /home/jas/conf/functions 
  javac sample.java -cp ..\..\common\lib\webStudioCore.jar

Esto nos genera un fichero sample.class en el mismo directorio /home/jas/conf/functions

Cargar la clase dentro de nuestro xsql-script.

Con el tag de xsql-script system.function.loadExternalFunction registramos y cargamos nuestra clase para que pueda ser usada dentro del xsql-script. Debemos informar los siguientes atributos

  • dir: Directorio del server en donde esta los ficheros de las clases compiladas, los .class.
  • name: Nombre de la clase que deseamos cargar.

Si tuvieramos varias clases, podemos poner n lineas del tag system.function.loadExternalFunction.

   &lt;system.function.loadExternalFunction dir='conf\functions' name='sample' /&gt;

Utilizar el tag dentro del xsql-script.

Ahora ya podemos utilizar el tag sample dentro de nuestro xsql-script. Luego de cargarlo con el tag loadExternalFunction podemos utilizarlo como si fuera un tag normal.

<xsql-script name='test_sample'>
    <body>
        
        <!-- load a java class and register it as my.sample -->
        <system.function.loadExternalFunction dir='conf\functions' name='sample' />

        <!-- this class simly retuns the upper case -->
        <println>
            <sample>
                this text is uppercase
            </sample>
        </println>

    </body>

</xsql-sctipt>

Si lo que necesitamos es sobrescribir un tag existente, el nombre que le debemos dar a al tag es igual al nombre del tag original.