Scripts de Ejemplo

RECU-0048 (Recurso Ejemplo)

Descripción

Para facilitar la programación de scripts de acceso a Alfresco, se proponen varios ejemplos que resuelven diferentes casos de negocio que se presentan habitualmente en la construcción de aplicaciones con Alfresco.

Ejemplos

Crear una copia de seguridad de un documento

Se crea una copia de seguridad de un documento y se añade a un espacio:

// buscamos la carpeta backup - la creamos si no existe
var carpetaBackup = space.childByNamePath("Backup");
if (carpetaBackup == null && space.hasPermission("CreateChildren"))
{
   // crear la carpeta por primera vez
   carpetaBackup = space.createFolder("Backup");
}
if (carpetaBackup != null && carpetaBackup.hasPermission("CreateChildren"))
{
   // copiar el documento en la carpeta de backup
   var copia = document.copy(carpetaBackup);
   if (copia != null)
   {
      // cabiar el nombre para así saber que es una copia de seguridad
      copia.name = "Copia de seguridad de " + copy.name;
      copia.save();
   }
}

Crear copia de seguridad de un documento y realizar log de las propiedades del mismo

Se crea un backup de un documento y se realiza un log de las propiedades del mismo en un fichero de texto:

// buscamos la carpeta backup - la creamos si no existe
var carpetaBackup = space.childByNamePath("Backup");
if (carpetaBackup == null && space.hasPermission("CreateChildren"))
{
   // crear la carpeta por primera vez
   carpetaBackup = space.createFolder("Backup");
}
if (carpetaBackup != null && carpetaBackup .hasPermission("CreateChildren"))
{
   // copiar el documento en la carpeta de log
   var copia = document.copy(carpetaBackup );
   if (copia != null)
   {
      // cabiar el nombre para así saber que es una copia de seguridad
      var nombreCopia = "Copia de seguridad de " + copia.name;
      copia.name = nombreCopia ;
      copia.save();
   }
  
   // record the time of the backup to a log file
   var logFile = carpetaBackup .childByNamePath("backuplog.txt");
   if (logFile == null)
   {
      logFile = carpetaBackup .createFile("backuplog.txt");
   }
   if (logFile != null)
   {
      logFile.content += "Fichero: " + nombreCopia +
                         "\tFecha: " + new Date().toGMTString() +
                         "\tTamaño: " + copia.size + "\r\n";
   }
}

Añadir linea de Copyright a un fichero

Añade una linea de copyright de contenido a ficheros HTML y de texto plano:

if (document.hasPermission("Write"))
{
   if (document.mimetype == "text/plain")
   {
      document.content += "\r\n\r\nCopyright (C) 2008";
   }
   else if (document.mimetype == "text/html")
   {
      document.content += "<br><br><small>Copyright © 2008</small>";
   }
}

Añadir Aspectos

Se añaden varios aspectos a un documento:

var propiedades = new Array(1);
propiedades["cm:template"] = document.nodeRef;
document.addAspect("cm:templatable", propiedades);
propiedades = new Array(1);
propiedades["cm:lockIsDeep"] = true;
document.addAspect("cm:lockable", propiedades);
propiedades = new Array(1);
propiedades["cm:hits"] = 1;
document.addAspect("cm:countable", propiedades);

Buscar documentos usando una búsqueda Lucene

Buscar todos los documentos que contengan el texto 'Alfresco' usando una búsqueda Lucene y grabar los resultados en un fichero de log.

// realizar log de los documentos que contienen la palabra 'Alfresco' en un fichero.
var logFile = userhome.childByNamePath("alf docs.txt");
if (logFile == null)
{
   logFile = userhome.createFile("alf docs.txt");
}
if (logFile != null)
{
   // execute a lucene search across the repo for the text 'alfresco'
   // ejecuta una busqueda Lucenea través del repositorio para el texto 'alfresco'
   var documentos = search.luceneSearch("TEXT:alfresco");
   var log = "";
   for (var i=0; i<documentos.length; i++)
   {
      log += "Nombre: " + documentos[i].name + "\tRuta: " + documentos[i].displayPath + "\r\n";
   }
   logFile.content += log;
}

Devolver un valor como resultado

Se devuelve un valor como resultado de la ejecución del script. Esto es util para scripts que son procesados mediante URls usando el Servlet de Ejecució de Scripts ya que los resultados son devueltos como respuestas HTML por el servlet.

function resultado()
{
   return "El nombre de mi espacio raiz es: " + userhome.name;
}
result();

La siguiente solución también devolverá un valor si se coloca al final de un script:

// aqui el script here
// ...
var resultado = "algunos resultados...";
result;

Crear Documento, Hacerlo versionable, Modificarlo

En este scripts se van ha realizar varias manipulaciones de un contenido. Los pasos que e van a seguir son: crear un documento, harcerlo versionable, desprotegerlo, modificar el contenido de la copia de trabajo, protegerlo de nuevo y repetir el proceso pero añadiendo un descripción para el histórico y un incremento del numero de versión al protegerlo:

// crear un fichero y hacerlo versionable
var documento = userhome.createFile("checkmeout.txt");
documento.addAspect("cm:versionable");
documento.content = "texto original";
// desprotegerlo y cambiar el contenido de la copia de trabajo
var copiadeTrabajo= documento.checkout();
copiadeTrabajo.content = "Actualizando texto 1";
// Protegerlo
documento = copiadeTrabajo.checkin();
// Repetimos el proceso
copiadeTrabajo= documento.checkout();
copiadeTrabajo.content = "Actualizando texto 2";
// Lo protegemos de nuevo, pero nota para el historico de versiones y un incremento en la versión
documento = copiadeTrabajo.checkin("nota para el historico", true);

Cambiar el Tipo Mime de un documento

Cambiar el tipo mime de un documento después de establecer el contenido

var fichero = userhome.createFile("ficherodetest.html");
fichero.content = "texto <b>HTML</b> aqui";
fichero.mimetype = "text/html";

Crear un Documento y Transformarlo

Crear un documento y convertirlo en nuevos formatos usando la API de transformaciones:

// crear un documento de texto plano y convertirlo a PDF, el fichero generado en el mismo espacio que el original
var documento1 = userhome.createFile("transforma_me1.txt");
documento1.mimetype = "text/plain";
documento1.content = "Esto es texto plano";
var transformado1 = documento1.transformDocument("application/pdf");
// crear un documento HTML and convertirlo en texto plano, en nuevo fichero será generado en el espacio companyhome
var documento2 = userhome.createFile("transforma_me2.html");
documento2.mimetype = "text/html";
documento2.content = "Esto es un <b>documento</b> <font color=blue><i>HTML</i>!</font>";
var transformado2 = documento2.transformDocument("text/plain", companyhome);
// crear un documento HTML and convertirlo  en un archivo swf flash, el fichero generado se debe crear en el espacio companyhome
var documento3 = userhome.createFile("transforma_me3.html");
documento3 .mimetype = "text/html";
documento3 .content = "Esto es un <b>documento</b> <font color=blue><i>HTML</i>!</font>";
var transformado3 = documento3.transformDocument("application/x-shockwave-flash", companyhome);

Convertir un documento de imagen en otros formatos:

// convertir a formato GIF y colocarlo en el espacio companyhome
var imagenGif = document.transformImage("image/gif", companyhome);
// convertir una imagen a formato JPG y redimensionarla a tamaño de thumbnail
var thumbImage = document.transformImage("image/jpeg", "-resize 120");

Ejecutar una plantilla Freemarker

Ejecuta una plantilla del repositorio en el nodo Document actual:

var plantilla = companyhome.childByNamePath("/Data Dictionary/Presentation Templates/doc_info.ftl");
if (plantilla != null)
{
   var resultado = document.processTemplate(plantilla);
   // escribir los resultados en la consola de log 
   logger.log(resultado);
}

Se puede también construir una plantilla FreeMarker directamente en el script, también construir una lista de argumentos para la plantilla. El resultado de la plantilla es grabado en un nuevo nodo:

var plantilla = "<h3>El nombre del Documento es ${document.name}</h3>" +
               "El argumento ID: ${args['id']}";
var argumentos = new Array()
argumentos ["id"] = "01234-56789";
var resultado = document.processTemplate(plantilla, argumentos);
// grabar el contenido del resultado de la plantilla a un nuevo nodo en el espacio raiz del usuario
var ficheroSalida = userhome.createFile("output.txt");
ficheroSalida .content = resultado;

Mostrar el actual conjunto de permisos en el espacio del usuario

var permisos = userhome.permissions;
var resultado = "";
for (var i=0; i<permisos.length; i++)
{
   resultado += permisos[i] + "<br>";
}
resultado;

Incluir otros dos javascripts, uno desde el classpath y otro desde el repositorio

<import resource="classpath:alfresco/extension/misutilidades.js">
<import resource="/Company Home/Data Dictionary/Scripts/mislibrerias.js">
// a partir de aqui el script
// ...

Crear diferentes tipos de nodos hijos

Se crearán nodos hijo de varias clases por ejemplo a través de una asociación hija especificada por el nombre y con propiedades por defecto.

var nodo1 = userhome.createNode("creado test1.txt", "cm:content");
nodo1.content = "contenido nodo1";
var nodo2 = userhome.createNode(null, "sys:base");
var propiedades = new Array();
propiedades ["cm:name"] = "creado test3.txt";
var nodo3 = userhome.createNode(null, "cm:content", propiedades);
propiedades ["cm:name"] = "nodo nombre4.txt";
propiedades ["cm:title"] = "nodo titulo4";
var nodo4 = userhome.createNode(null, "cm:content", propiedades , "cm:contains");
var resultado = "nodos creados correctamente";
resultado;

Itererar por valores usando for in y for each in

// ejemplo de iteración por indices de array usando 'for .. in'
var salida1 = "";
for (i in userhome.children)
{
   salida1 += userhome.children[i].name + "<br>";
}
// ejemplo de iteración por indices de array usando 'for each .. in'
var salida2 = "";
for each (n in userhome.children)
{
   salida2 += n.name + "<br>";
}
var salida = salida1 + "<br><br>" + salida2;
salida;

Creación y eliminacion de asociaciones

Ejemplo de creacion y eliminación asociaciones:

var nodoOrigen= userhome.createNode("ficherotestassocs.txt", "cm:content");
nodoOrigen.content = "el texto original";
nodoOrigen.addAspect("cm:transformable");
var nodoDestino = userhome.createNode("traduccion1.txt", "cm:content");
nodoDestino.content = "la tranduccion del texto original";
nodoOrigen.createAssociation(nodoDestino, "cm:formats");
var nodoTemp = userhome.createNode("borrar.txt", "cm:content");
nodoTemp.content = "borrar";
nodoOrigen.createAssociation(nodoTemp, "cm:formats");
//obtener los nodos objetivo de la asociación 'cm:formats'
var translations = nodoOrigen.assocs["cm:formats"];
nodoOrigen.removeAssociation(tempNode, "cm:formats");
nodoTemp.remove();

Usar la API AVM para Procesar un Store de un Proyecto Web

Ejemplo de uso de la API AVM para procesar un store - el nombre del store se pasa en los argumentos de la URL

if (args["store"] == null)
{
   logger.log("ERROR: Argumento 'store' no especificado.");
}
else
{
   main();
}
function main()
{
   var nodoStoreRaiz = avm.lookupStoreRoot(args["store"]);
   if (nodoStoreRaiz != null)
   {
      var ruta = nodoStoreRaiz.path + "/ROOT/admin/index.html";
      var nodo = avm.lookupNode(ruta);
      if (nodo == null)
      {
         return "ERROR: Imposible encontrar ruta: " + ruta;
      }
     
      var store = avm.lookupStore(args["store"]);
      if (store == null)
      {
         return "ERROR: Imposible encontrar store: " + args["store"];
      }
      var nodoRaiz = store.lookupRoot();
      if (nodoRaiz == null)
      {
         return "ERROR: Imposible encontrar nodo raiz para el store: " + store.name;
      }
     
      var salida = "";
      var resultados = store.luceneSearch("TEXT:tomcat");
      for (var i=0; i<resultados.length; i++)
      {
         salida += resultados[i].path + "<br>";
      }
      return out;
   }
}

Descubrir que acciones del repositorio están disponibles

function resultado()
{
   return (actions.registered);
}
resultado();

La salida será algo parecido a:

[transform-image, mail, copy-to-web-project, extract-metadata, counter, check-in, simple-workflow, script, transform, remove-features, specialise-type, import, add-features, link-category, blog-post, move, copy, check-out]

Descubrir todos los formularios XML de un tipo especifico y devolver el contenido XML

var store = avm.lookupStore("test");
var resultados = store.luceneSearch("wca\\:parentformname:Comunicado de Prensa");
var comunicadosprensa = new XML();
comunicadosprensa = <comunicadosprensa></comunicadoprensa>
for (var i=0, len=resultados.length; i<len; ++i){
    var str = new String(resultados[i].content);
    str = str.substr(38, str.length - 1 );   // Nota: se asume codificación UTF-8 para todos los documentos XML
    var comunicadoprensa = new XML(str);
    comunicadosprensa.comunicadoprensa = comunicadoprensa ;
}
model.comunicadosprensa = comunicadosprensa.toXMLString();

Se podrá devover el XML usando:

${comunicadosprensa}