Mostrando entradas con la etiqueta alfresco. Mostrar todas las entradas
Mostrando entradas con la etiqueta alfresco. Mostrar todas las entradas
domingo, 8 de diciembre de 2013

Auditorías ... Auditorías everywhere.  

Muy buenas a todos.

Me gustaría hablaros en esta ocasión de auditar contenido en un Alfresco 3.4, que como sabéis por defecto el contenido que auditéis se os muestra en los logs como texto plano (poco intuitivo y algo difícil de leer). En este mini tutorial os quiero enseñar lo que yo he puesto en algunos clientes, que aunque sea básico, creo que es bastante útil :-) 

Os quiero hablar del módulo de auditorias ASUR, creado por la empresa Francesa StarXpert para Alfresco 3.4 y que creo que más de un cliente o usuario final agradecerá tenerlo.
La idea es sencilla: Obtener una gráfica con las transacciones que se tienen según un filtrado (hora, mes, día, etc..) y una información mínima ¿Lo bueno de usarlo? Que tiene incluso ejemplos sencillos de auditorias ya pre configuradas y que además podréis añadirles auditorías propias.
Además de éste módulo os enseñaré cómo complementarlo instalando un dashlet para auditoria bastante útil para los administradores.


¿Qué debéis saber para comenzar este tutorial?

Obligatorio:
- Saber manejar el módulo de alfresco alfresco-mnt-tool para instalar los amps.
Opcional:
-Tener vuestro propio archivo para auditar.


Manos a la obra...


Por lo pronto deberemos tener nuestro archivo de auditoría con lo que queramos mostrar. En este tutorial no voy a entrar en detalles sobre cómo realizar un archivo para auditar contenido (más abajo os dejo links con alguna referencia) pero usaremos un ejemplo que os facilitaré para que hagáis la toma de contacto sin mucha dificultad.

Objetivos: Entender como instalar la consola ASUR, el dashlet de auditoria, configurarlo y así poder usar la auditoría en share de una forma mas intuitiva.

Descarga: aquí os dejo todo lo que necesitáis: Amps, jar y archivo de ejemplo







PASOS A SEGUIR

 1. Abrid el alfresco-global.properties (shared/classes/alfresco) y añadid estas lineas al final del todo

## Audit
audit.enabled=true
Colocamos el archivo con el mapeo de nuestra auditoría - (alfresco-audit-example-login.xml)
2. Copiamos el archivo a /tomcat/shared/classes/alfresco/extension/audit  (creamos esta carpeta si no la tenemos aun creada)

Habilitando el log para mostrar trazas del contenido que vamos a auditar.
3. Creamos un archivo con un editor de notas que llamaremos custom-audit-log4j.properties  y dentro pegamos estas lineas:
## Log para modulo de auditoria
log4j.logger.org.alfresco.repo.audit.AuditComponentImpl=info
log4j.logger.org.alfresco.repo.audit.inbound=info
Instalamos la consola en nuestro alfresco y share.
Alfresco ubicación del amp (ASUR-Alfresco-1.0.2.amp)
4. Cogemos el jar de Alfrescoy lo pegamos a alfresco_home/amps/
Share ubicación del amp (ASUR-Share-1.0.2.amp)
5. Cogemos el jar de Share y lo pegamos en alfresco_home/amps_share/

Para instalar los amps, por favor seguid estas indicaciones.
Consejo! Una vez estén compilados, desde cmd (consola de comandos) para estar seguros de que los tenemos desplegados ejecutad desde la carpeta bin: java -jar alfresco-mmt.jar list alfresco_ruta/tomcat/webapps/alfresco.war y  java -jar alfresco-mmt.jar list alfresco_ruta/tomcat/webapps/share.war  Si os sale un listado con los amps de ASUR, estamos preparados para seguir con el tutorial.

Dashlet con la consola (audit-dashlet-0.43.jar)
6. Pegar el jar  /shared/lib/

Y bien ya lo tenemos todo para echar a andar nuestro alfresco y empezar a trastear.

Arrancamos nuestro alfresco y accedemos a Share como admin. Lo primero que haremos será configurar nuestro dashlet de auditoría.

Accedemos arriba a la derecha a "Personalizar el panel de inicio"





Presionamos Añadir dashlet y arrastramos el "audit aplication" abajo y presionamos Aceptar.





En el dashboard del administrador sí que podremos ver por fin el dashlet pero tendremos que configurarlo de la siguiente forma para visualizar los datos que estamos auditando:




Presionamos en Configurar (o configure) y obtendremos esta pantalla:




Como veis, automáticamente  os coge el archivo de auditar que le hemos metido en la carpeta de  extension (en mi caso tengo alguno más). Lo seleccionamos y presionamos aceptar.


Nota: En el caso de que no os salga, bastará con introducir la palabra login y ya os aparecerá disponible la lista.
Y aquí tenéis la lista con los datos auditados


El null que aparece ha sido un intento fallido de login (con el usuario que no existía)



Ahora vamos a ver como se visualiza en la consola de audición del Share. Para ello pinchamos arriba en la derecha a + y al botón de la consola de audición:





Y nos encontraremos con la siguiente pantalla:



A la izquierda tenéis las auditorías disponibles, si bien lo único que debéis hacer es seleccionar una de ellas, ponerle un filtro (vista en horas,días, etc..), presionar submit y obtendréis una gráfica algo básica pero útil.

Y esto es todo para este turorial... Aunque quería recomendar que le echaseis un vistazo al dashlet para auditar contenido que tenéis disponible en la página de Share add-ons y manejarlo todo desde nuestro dashboard (como administrador, por ejemplo).  

Sin más, espero que os haya servido de ayuda :-) 

¡Ah! Os dejo algunos links de interés:
Auditoría - Wiki de alfresco
Tutorial para auditar en Alfresco 3.4


¡Un saludo a todos!
sábado, 10 de agosto de 2013
Buenas a todos.

Quiero compartir este problema porque, en un principio, no le encontramos solución buscando por Internet y creo que podría servirle a más de uno en el futuro:

Tenemos una instalación en un cliente con más de 100 gigas (y creciendo), unos 6.000 usuarios (creciendo también), un Alfresco 3.4.10 y una JVM de 8 gigas asignada (para la heap - Xmx y Xms).

Aqui el problema: Mediante un dashlet que mostraba todos los workflows de un usuario (usando el getPooledTasks del servicio del workflow), cuando intentaba rescatar alrededor de 5.100 tareas Alfresco no era capaz de reaccionar y nos mostraba este error a nivel de servidor de aplicaciones (catalina.out, o en mi caso el log hub de weblogic):

17:04:20,050  INFO  [webscripts.connector.RemoteClient] Error status 408 Read timed out
java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)....

El problema es que Alfresco, con la JVM que tiene (la heap en concreto) no es capaz de atender todas las peticiones que recibe, excediendo el tiempo que tiene establecido internamente para la respuesta entre Alfresco y Share (por defecto 120 segundos), de ahí a que muestre un read time out.

Investigando por Google encontramos varios JIRAs, pero hablan de la 4.0 y nosotros tenemos una 3.4. por lo que no nos servía.

Aquí la solución para la versión 3.4:


1. Abrir el jar spring-webscripts-X.X.X-SNAPSHOT.jar que encontráis en webapps/alfresco/WEB-INF/lib/ y navega dentro de él por: org/springframework/extension/webscript/

2. Copia spring-webscript-application-context.xml a tu carpeta web-extension (en shared/classes/alfresco) con el nombre custom-spring-webscript-application-context.xml

3. Incrementa las propiedades <property name="readTimeout"><value>120000</value></property>

4. Reiniciar el Alfresco

Y listo, ahora con el tiempo de respuesta incrementado cuando desde Share manda la petición alfresco es capaz de atender las peticiones y de devolver todas las tareas de ese usuario :-)


Espero que os haya servido  ;)

¡Un saludo!
miércoles, 20 de marzo de 2013
Muy buenas.
Hace poco un cliente me pidió customizar y ocultar algunos componentes para que los usuarios que no tuvieran permisos de administrador no los vieran. En concreto me refiero a los de la cabecera:




Pues bien, os quiero enseñar cómo hacerlo siguiendo las buenas prácticas en Alfresco.

Para filtrar los iconos, puedes configurarlo en el share-config-custom.xml (que debes tener ubicado en  /shared/clases/alfresco/web-extension/), entre los tags de <header> y </header> tal y como muestro en la siguiente captura:


Este fragmento, podéis copiarlo desde share-config.xml que tenéis ubicado en /webapps/share/WEB-INF/classes/alfresco/ y podeis pegarlo en vuestro share-condig personalizado dentro de web-extension como os comenté más arriba.

Si observáis, lo único que debéis es añadir en el apartado que queráis ocultar permission="admin" y de esta forma solo será visible para éste.

 Por ejemplo:

 <item type="link" id="repository" permission="admin">/repository</item> 

Con esa línea le decimos a Share que nos oculte el icono del repositoriopara todos aquellos usuarios que no sean administradores.

El cliente necesitaba ocultar, además de estos iconos, la búsqueda del share que encontramos arriba a la derecha en el dashboard del usuario:


Pero desafortunadamente, para Alfresco 3.4 no es posible controlarlo en el header como los anteriores iconos. Así que optamos por lo más sencillo: Ocultarlo mediante una clase que la declaramos en un css con un display:none.

Espero que os haya servido de ayuda. De todas formas, a medida que vaya trabajando y sacando más cosillas os la iré compartiendo :-)


Un saludo!
lunes, 21 de noviembre de 2011
Muy buenas a todos.

Seguramente a más a uno os ha parecido incómodo el hecho de Alfresco arranque como sevicio en windows, y no poder ver el log del tomcat, entre otras cosas, a la vez que arranca. Pues bien, os dejo un truco sencillo que os permitirá arrancarlo como siempre y sin que se levante como servicio de Windows.
 
Lo primero que debemos hacer es editar el archivo $ALF_HOME$/tomcat/bin/startup.bat e incluir:
set JAVA_OPTS=-Xms512m -Xmx1024m -Xss1024k -XX:MaxPermSize=256m -XX:NewSize=256m -server -Dfile.encoding=UTF-8

Esto incluye el Perm que es necesario para que la aplicación levante, ya que si no lanza un error grave y no levanta la Webapp.
Nota: Tened cuidado con los valores de estas variables, pues según le indiquéis esa será la memoria que consuma en vuestro equipo.

El segundo paso es copiar el archivo $ALF_HOME$/tomcat/webapps/alfresco/WEB-INF/classes/log4j.properties, pegarlo dentro de
$ALF_HOME$/tomcat/shared/classes/ y sustituir:
log4j.appender.File.File=alfresco.log

por:

log4j.appender.File.File=C:/Alfresco/tomcat/logs/alfresco.log

De esta manera el archivo 'alfresco.log' se generar en el directorio de 'logs' del Tomcat y no en el directorio 'system32' de nuestro sistema como hasta ahora lo estaba haciendo.
 
Para arrancar nuestro alfresco ahora lo deberemos hacer con el siguiente script:
$ALF_HOME$/tomcat/bin/startup.bat

Y para detener nuestro alfresco:
$ALF_HOME$/tomcat/bin/shutdown.bat

En linux sería similar:

En mi caso uso ubuntu 11.10, aunque da igual que distribución utilicéis: En el primer caso deberíamos "exportar JAVA_OPTS", en vez de especificarlo con el "set" lo especificaremos de la siguiente forma:

export JAVA_OPTS="-XX:MaxPermSize=512m -Xms1024m -Xmx2536m -Dalfresco.home=/opt/alfresco -Dcom.sun.management.jmxremote"


Donde -Dalfresco.home indicamos la ruta donde está instalado nuestro alfresco, en mi caso en /opt/alfresco


En el caso de linux, el log por defecto se encuentra en la raiz donde instalamos nuestro alfresco, o sea, en /opt/alfresco/alfresco.log


Para arrancar el alfresco en este caso en vez de usar los .bat usaremos los .sh como más arriba os especifiqué, o tenemos la opción de hacerlo por comandos desde la terminal ejecutando el script alfresco.sh que e encuentra en la raiz de nuestro alfresco (/opt/alfresco) de la siguiente forma: 

./alfresco.sh start
y
./alfresco.sh stop

¡Espero que os sirva!

¡Un saludo!
jueves, 3 de noviembre de 2011

Buenas.

Cuando tienes que desarrollar con lucene, sobre todo si nunca antes lo has visto, siempre surgen dudas sobre como se deben componer las querys, como lanzarlas para comprobar rápidamente su resultado, querys que uno cree que funciona pero no muestra nada, etc..
Pues bien, hoy os voy ha mostrar una de esas "consolas ocultas de alfresco" de las que ya habló hace un tiempo Toni de la Fuente en su blog, y que creo que en más de una ocasión os podrá salvar la vida (aunque parezca que exagero, realmente hay personas que intentando comprender Lucene se ha llevado buenos dolores de cabeza jaja).

En resumen: Con la consola podrás realizar varias acciones como ejecutar querys rápidamente, ver si algún nodo presenta alguna de sus propiedades corruptas, etc.. Este tutorial no pretende ser una guía de la propia consola pero sí una guía sobre cómo usar la consola, está enfocada a Lucene y sus querys, y que con ella seas capaz de aprender a usarla.

Índice del (mini) tutorial:

1.- Accediendo a la consola
2.- Conociendo la consola
3.- Links de interés.

1.- Accediendo a la consola.
Lo primero que tenemos que tener en cuenta es que para acceder a la consola debes ser un usuario con permisos de administrador. Mi ejemplo lo voy a realizar con el usuario admin que tiene por defecto Alfresco.
Pasos a dar para acceder:
  • Accedemos a alfresco (http://IP:PUERTO/alfresco) 
  • Acceder con un usuario que tenga permisos de Administrador
  • Pulsar arriba a la derecha sobre el botón "consola de administrador"
  • A continuación debemos clickar sobre "Navegador de Nodos"


  • Para navegar sobre el repositorio y ver los nodos que hay dentro del mismo, pinchamos sobre workspace://SpacesStore
    Os preguntaréis sobre las distintas opciones y para qué sirven, pues bien no son más que Stores de Alfresco pero ¿y qué son Stores? Pues cada Store no es más que un área del repositorio y dentro de cada uno de ellos contienen "X" nodos organizados jerárquicamente. Una vez accedemos a uno de ellos, entratemos siempre en la ráiz del mismo. Por ejemplo: El store de user: es el store encargado de almacenar todos los nodos relativos a los usuarios o el store worspace el relativo a los espacios y lo que cuelgue de él, es decir, como si lanzamos desde Company Home una consulta.

    Tomadlo como si Alfresco fuera un edicifio de oficinas, los stores fueran las oficinas que hay en cada planta de ese edificio, y dentro de cada oficina están los empleados, lugares de trabajo, etc..

    Por norma general, casi un 80% de los casos, lucene lo utilizamos para buscar información sobre un nodo, o lanzamos una query para que nos devuelva un listado con varios resultados de documentos que hemos subido a nuestro alfresco. Todos estos documentos están sobre el Store "workspace". Ese será nuestro objetivo en este tutorial, aunque dependiendo de la naturaleza de la consulta que queráis hacer, tendremos que seleccionar un Store u otro según corresponda.
  • Como vamos a trabajar con documentos, pinchamos en workspace://SpacesStore. Lo que nos lleva a la segunda parte del tutorial.

2.- Conociendo la consola.
  • Una vez accedamos se nos muestra una ventana similar a esta:

  • Lo primero, seleccionamos el tipo de consulta que vamos a realizar en el desplegable de la izquierda. En nuestro caso "Lucene":
    Como véis, podemos lanzar consultas de varios tipos: Desde lanzar un noderef para examinar un nodo (por ejemplo si tiene alguna de sus propiedades corruptas), o incluso lanzar una consulta con XPath.

  • Para probar nosotros como funciona, lanzaremos por ejemplo la siguiente query: 
    +TYPE:"cm:category" +PATH:"cm:generalclassifiable//*"
    Esta query mostrará un listado con tooodas las categorías que tengas en tu Alfresco.
  • Comprobad que entre la lista, está la categoría "Languages", si pinchamos sobre ella iremos al nodo y sus propiedades directamente, pero ¿siempre tendremos que buscar el nodo que queremos entre un listado tan grande? ¿No podemos filtrar por nombre? Pues claro que sí, eso será lo siguiente que hagamos.

  • Como nosotros queremos dar un paso más, vamos a buscar el nodo directamente por su nombre. Para ello lanzaremos de nuevo la siguiente query:
    +TYPE:"cm:category" +PATH:"cm:generalclassifiable//*" +@cm\:name:"Languages"
    Como véis no tiene más que añadir el +@cm\:name:"nombre_que_busquemos".
  • Pinchad sobre el nombre. Os deberá aparecer algo similar a esta imagen:

  • Pues bien, ahí tenéis las distintas partes de la que se compone un nodo:

    1) Properties: Las propiedades/metadatos que componen el nodo tales como el nombre, la fecha de creación, etc..
    Estos datos los podéis ver si observáis en la columna de la izquierda, suyo titulo es  es Name y valor {http://www.alfresco.org/model/content/1.0}name. Después está el valor que contiene ese metadato, en nuestro caso "Languages", tipo de metadato, en nuestro caso de tipo "texto", etc..
    2)  Aspects: Los aspectos que tiene ese nodo aplicado.
    3) Permissions: Nos muestra qué permisos tiene asociados el nodo, tanto de grupos como de usuarios.
    4) Sus "hijos": Dentro de lenguages, encontraremos nodos que dependen de él, como por ejemplo "English", "Spanish", etc..
    5) Associations: Tipo de asociaciones que tiene ese nodo.
    6) Parents: Información sobre el nodo del que depende. 

A partir de aquí ya conocéis minimamente la herramienta, tanto como para empezar a trastear y bichear por vuestra cuenta. Lo realmente bueno de la misma es poder ejecutar querys directamente, y sobre todo si alguna vez detectáis algún problema con un nodo, podéis explorar con esta consola internamente qué dato está mal o corrupto. Aunque el verdadero potencial se lo iréis sacando a medida que vayáis probando =)

 3.- Links de interés.
 Os dejo una tanda de links que sin duda alguna os servirán de ayuda durante la travesía.

Y esto es todo... Por el momento. Espero que os haya servido de ayuda a la vez que habéis aprendido algo nuevo ;-)

Un saludo a todos y ¡hasta la próxima!
miércoles, 24 de agosto de 2011
Muy buenas a todos.

Hace algún tiempo empecé a escribir un tutorial sobre cómo empezar a bichear los javascripts en alfresco. Pues bien, mi meta con este post es un poco el haceros un resumen sobre los pasos finales que os pueda recomendar para poder abordar los pequeños desarrollos con mayor agilidad y facilidad e intentar facilitaros un poco el trabajo.

Documentación & entorno de trabajo.
Antes de nada, tened siempre a mano abierto los siguientes links que os servirán de apoyo para realizar vuestros scripts:

  1. APIs Javascripts en Alfresco. Dependiendo de la versión de alfresco que utilices, seleccionala dentro de la wiki para ver las funciones o métodos que hay disponible para esa versión.
  2. Cookbook de javascript. Dentro de la wiki, está este "libro de recetas" con muchos ejemplos con javascript.
  3. MADEJA. Sección proporcionada por la Junta de Andalucía con el contenido en Castellano =) (además tienes mucha información de Alfresco).
  4. Por supuesto, tener siempre acitvada nuestra consola de depuración para ver qué hace nuestro script. También existe para el Share (en vez de http://localhost:8080/alfresco/service/api/javascript/debugger, es http://localhost:8080/share/service/api/javascript/debugger) a partir de la 3.3.x
  5. La Comunidad de Alfresco. Sé que muchos preguntáis allí, pero lo que debemos entre todos es intentar cada día ayudarnos. Recordad eso de "hoy por tí, mañana por mí" ;)
Consejo: Además de todo esto, si usáis Firefox os recomiendo que os bajéis la extensión "Firebug" que sirve para mostraros el código fuente de una página que estáis visualizando (observad las fotos del enlace). Esto sirve, sobre todo, para ver qué valores tiene o adquiere un elemento cuando lo modificáis.
Un ejemplo sencillo: Imaginad que queréis quitar de la parte de abajo el logo de Alfresco y el Copyright porque os ha pedido el cliente que pongáis el suyo, pues bien con esta aplicación, sobre el banner/logo si pulsáis el botón derecho del ratón y le dáis a inspeccionar elemento, os saldrá la url de donde está cargando esa imagen y como se llama, así podréis buscarla en vuestro despliegue para una manipulación libre =)

Nota: Chrome, trae ya por defecto en sus últimas versiones una utilidad similar a esta nativamente y sin necesidad de descargar nada adicional.

Una vez preparado vuestro entorno, ¡es hora de desarrollar! =)

Aportaciones. 
Ya sabéis que soy bastante partidaria de la colaboración (pensad que es ahorrar trabajo y no malgastar tiempo en cosas que ya se han hecho), así que en este apartado os voy a poner script o trozos de código para que los podáis reutilizar. 

Consejo: Cuando se os plantee algún desarrollo "grande", tened presente eso de "Divide y Vencerás": Intentad dividirlo en otros más pequeños, así se te hará bastante más sencillo el realizar el desarrollo y depurarlo.

Aquí algunos ejemplos que os comparto:

  • Contar los documentos de forma recursiva.

contar(companyhome.childByNamePath("mi_espacio"));

function contar(nodeVar) {
    if (nodeVar.isDocument) {
       if(nodeVar.mimetype == "application/pdf" )
             arrayTipos[0]++;
       else if (nodeVar.mimetype == "application/msword" )
             arrayTipos[1]++;
      else
             arrayTipos[2]++;
        contadorDocs++;               
      } else if (nodeVar.isContainer) {
        var childrenList = nodeVar.children;
        for (var i = 0; i < childrenList.length; i++) {
            contar(childrenList[i]);
        }
    }
}

  • Obtener categoria "Empresas" y sus hijos utilizando lucene.

var catName="Empresas";
var srchQuery = "+TYPE:\"cm:category\" +PATH:\"/cm:generalclassifiable//*\"";
srchQuery += " +@cm\\:name:\""+catName+"//*\"";
var categoria = search.luceneSearch(srchQuery);
var catHijos = categoria.children;

  • Creación de un log llamado date_log.txt con la fecha de creación de un documento dado.

function fecha (node){
  salida+="Prueba fecha \r\n";
  var fecha = node.getCreatedDate();
  salida+="Rescata: "+fecha+" \r\n";
}

var salida = "";
var logFile = script.parent.childByNamePath( "date_log.txt" );
if ( logFile == null )
 logFile = script.parent.createFile( "date_log.txt" );

//Llamada a funcion principal
fecha(document);

//Salvamos el log para guardar
logFile.content += "LOG \r\n\r\n";
logFile.content = salida+"\r\n\r\n";
logFile.save();
logFile.content;


  •  Script para desasociar las categorias de todos los documentos (usando API de Alfresco 2.1.X)


function recorre(nodeVar) {

  salida+="Comienzo del script \r\n";

    if (nodeVar.isDocument) {
            salida+= "\n"+nodeVar.displayPath+"/"+nodeVar.name+"\r\n";
   limpiaCatXNodo(nodeVar);
      } else if (nodeVar.isContainer) {
  
   var childrenList = nodeVar.children;
   for (var i = 0; i < childrenList.length; i++) {
    recorre(childrenList[i]);
   }
    }
}
function limpiaCatXNodo(node){
  var array = node.properties["cm:categories"];
 salida+="[Funcion limpiaCatXNodo] Se obtienen las categorias \r\n";
  if (array!=null){
   var nodeName = node.properties.name;
  
  // busca las categorias dentro del nodo
  var categories = node.properties["categories"];
  if(!categories || categories == null) {
    categories = [];
  }
  for(i in categories) {
    salida+="[Funcion limpiaCatXNodo] Documento: "+node.properties.name+" \r\n";
    salida+="------------------------------- \r\n";
    salida+="Se va a eliminar la categoria: "+categories[i].name+" \r\n";
    categories.pop(i); // elimina las categorias del nodo
    salida+="------------------------------- \r\n\r\n";
  }
    node.properties["categories"] = categories;
  node.save();
   }else{
  salida+="[Funcion limpiaCatXNodo] No hay categorias asignadas a el documento: "+node.properties.name+" \r\n";
 }
  salida+="[Funcion limpiaCatXNodo] Fin funcion elimina categoria \r\n";
}
/////////////////////////////////
//VARIABLES y CONFIGURACION LOG//
/////////////////////////////////
var salida = "";
var logFile = script.parent.childByNamePath( "Log_LimpiaCat.txt" );
if ( logFile == null )
 logFile = script.parent.createFile( "Log_LimpiaCat.txt" );
recorre(space);
//Salvamos el log para guardar
logFile.content += "LOG \r\n\r\n";
logFile.content = salida+"\r\n\r\n";
logFile.save();
logFile.content;


Conclusión.
Como veréis no tiene más ciencia que mirar la API del alfresco sobre le que voy a lanzar mi script, decidir qué quiero conseguir hacer, buscar en ella alguna función que sirva de base y poco más. 

Os animo a que compartáis vuestro código en la comunidad y ya sabéis que si encontráis algo que pueda enriquecer este post, comentadmelo para añadirlo ^__^


¡Un saludo a tod@s y gracias!

Índice de la guía:
Capitulo primero.
Capitulo segundo.
Capitulo tercero.


martes, 26 de abril de 2011
¡Buenas a todos!

Hace algún tiempo publiqué un post en el que explicaba brevemente como ocultar los enlaces de crear sitio en los Alfresco versión 3.3.x pues bien (aquí el post), gracias a nuestro compañero nermp de los foros de alfresco de la comunidad Española , os comento como debe hacerse para la versión 3.4.0 enterprise que es la que he probado (supongo que valdrá para las posteriores 3.4.x):

En realidad era una tontería porque hay que seguir exactamente los pasos del post que publiqué pero en vez de tocar el archivo header.get.html.ftl hay que tocar sites.get.html.ftl


Os pego qué hay que modificar:


Copiar el archivo desde:
Alfresco340\tomcat\webapps\share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\modules\header\sites.get.html.ftl 

En el del directorio de shared como se explica en el anterior post:
Alfresco340\tomcat\shared\classes\alfresco\web-extension\site-webscripts\org\alfresco\modules\header\sites.get.html.ftl

Las líneas que hay que tocar son desde la 35 a la 39 y embeberlo con el <#if user.isAdmin>, tal que así:

<#if user.isAdmin>
      <ul class="create-site-menuitem">
         <li>
            <span><a href="#" onclick='Alfresco.util.ComponentManager.get("${id_js}").showCreateSite(); return false;'>${msg("label.create-site")}</a></span>
         </li>
      </ul>
</#if>

Y listo =)

El resto es exactamente igual que en el post anterior.

Espero que os sirva de ayuda ^__^

¡¡Un saludooooo!!
miércoles, 2 de marzo de 2011
Buenas..


¿Recordáis que hace algún tiempo publiqué una entrada comentando el error: "The remote server may be unavailable.."? Pues bien, iba a hacer una pequeña anotación pero viendo la importancia que puede tener y el hecho de que en su momento no encontramos ninguna solución, os lo posteo como nueva entrada por si a alguno os ha ocurrido para que lo tengáis en cuenta.


El problema se nos presentó cuando accedíamos a un sitio del Share e intentábamos subir un documento (daba igual de qué tipo fuera, extensión, si era uno o varios) el tiempo de espera en la carga era demasiado exagerado: Subir un documento txt de 1 kbs tardaba más de 5 minutos, el mismo tiempo se nos presentaba cuando intentábamos subir un doc con mayor peso.


El entorno que teníamos era el siguiente:
Alfresco 3.3.2 enterprise
Windows server 2008
Autenticación NTLM y SSO (single sign on) activado.


Al menos pudimos acotar de donde podría venir el error: Al probar con otro sistema operativo (una distro de linux) y con otra versión (una 3.3.4 Ent), pensamos que el problema estaba en usar NTLM y SSO pero no encontramos ninguna referencia al respecto ni en los foros, ni en el JIRA.. Nada de nada.


Pues bien todo tiene que ver con los dichosos end-points:
Por defecto en el share-config-custom.xml vienen comentado, si os fijáis hay dos con la misma id (alfresco) pues bien os describo los casos que tenemos constancia:


- Si descomentas ambos (la solución que yo di) el SSO no funciona, pero una vez te logas vale para toda la sesión (navegación, edición online de documentos, etc..).
- Si comentas el segundo:

<!--
<endpoint>
<id>alfresco</id>
<name>Alfresco - user access</name>
<description>Access to Alfresco Repository WebScripts that require user authentication</description>
<connector-id>alfresco</connector-id>
<endpoint-url>http://localhost/alfresco/s</endpoint-url>
<identity>user</identity>
</endpoint>


-->


El SSO funciona pero el tiempo de espera al subir documentos es demasiado larga.


Conclusión: O prescindes del SSO (aunque una vez te logas la primera vez ya sirve para el resto de sesión), o tienes muuuuuuuuuuuuucha paciencia (cosa que no veo viable de cara al uso en empresa).


De momento no sabemos muy bien por qué ocurre esto pero si llego a saberlo lo publico para que lo tengáis en cuenta.


Me gustaría dar las gracias a Ferran García López (de Barcelona) que es quien, con una paciencia increíble, se dio cuenta de todo esta problemática, su origen y lo más parecido a una "solución".


¡Un saludo!
miércoles, 23 de febrero de 2011
Como sabemos en Share tenemos dos tipos de dashboard: El del usuario al logarse compuesto de sus dashlets:


Y el propio de un sitio cuando lo creamos:



Uno de los potenciales de Share es que prácticamente el 100% es modificable y personalizable, a fin de cuenta si navegáis por los archivos veréis que todas las acciones del Share no son más que simples webscripts, por lo que es relativamente sencillo personalizar nuestro Share según nos convenga.

Como aquí todo el mundo parte de cero (sí, pegándonos contra el portátil/PC hasta sacar lo que nos hayan pedido) pues he decidido ir publicando poco a poco las cosas que he ido descubriendo para que os vaya ahorrando quebraderos de cabeza. Recordad siempre: Hoy por ti, mañana por mí. =)

Hoy os voy a explicar cómo debéis hacer para personalizar un dashboard sea de un sitio o de los usuarios. Cosas a tener en cuenta antes de tocar nada:

1.-  Cuando damos de alta un nuevo dashboard de tipo sitio lo que realmente estamos es  creando un nuevo tipo de sitio personalizado, es decir, que cuando hagamos la acción de “Crear Sitio” en el desplegable de las opciones aparecerá el nuestro personalizado (con el nombre y dashlets que hayamos definido).
2.- El dashboard del usuario es común para todos los usuarios de nuestro sistema.
3.- Si creamos un dashboard de cualquier tipo, todos los anteriores creados en nuestro share no se verán afectados.  A partir de que nosotros lo creemos será efectivo el cambio al crear usuarios o un sitio de nuestro tipo.
4.- Cuando se hace una personalización siempre tenemos en mente las llamadas buenas prácticas (extender dentro de ../tomcat/shared/  y no sobre ../share/WEB-INF/), pero en este caso detecté un bug en el que uno de los ficheros que modificamos no lo coge desde el web-extension, por lo que debemos extenderlo directamente en el despliegue (../webapps/share/WEB-INF..). Este bug está reconocido tanto para la 3.3.2 como para la 3.3.4, y sé que no está en la versión 3.2.x, por lo que de forma excepcional y si usáis alguna de estas distribuciones, deberemos desplegar directamente en el despliegue.
5.- Todos estos archivos los sacaremos de dentro de ..webapps\share\WEB-INF\classes\alfresco\* Todo lo que queramos desplegar sobre shared\classes\alfresco\web-extension\ deberemos copiar y respetar la estructura de las carpetas.

P.e. si copiamos site-data\presets\preset.xml lo tomamos de dentro de WEB-INF\classes\alfresco\site-data\presets\preset.xml y copiaremos tal cual la estructura dentro de shared\classes\alfresco\web-extension\
Pues bien, una vez explicados esos puntos vamos a pasar manos a la obra =)
Archivos a modificar, ruta donde desplegaremos y breve explicación:

* presets.xml
$ALF_HOME\tomcat\shared\classes\alfresco\web-extension\site-data\presets\presets.xml
Archivo donde declararemos los  dashboards personalizados.
create-site.get.js
$ALF_HOME \tomcat\shared\classes\alfresco\web-extension\site-webscripts\org\alfresco\modules\create-site.get.js
Archivo que registra los diferentes dashboards que hay declarados en nuestro Share.
create-site.get.properties
$ALF_HOME \tomcat\shared\classes\alfresco\web-extension\site-webscripts\org\alfresco\modules\create-site.get.properties

Traducciones de los labels personalizados que hemos creado.

* Si usáis una 3.3.x hay un bug detectado y debéis desplegarlo sobre $ALF_HOME\tomcat\webapps\share\WEB-INF\classes\alfresco\site-data\presets\presets.xml sino no os cogerá vuestro fichero.

En nuestro ejemplo vamos a declarar un sitio que se llamará Proyectos y definiremos un dashboard común para todos los usuarios con unos dashlets determinados:  Mis Sitios, Mi perfil, Mis Actividades.


presets.xml

Dentro del archivo presets.xml debemos añadir nuestro tipo de sitio personalizado y si queremos modificar el dashboard del usuario debemos hacerlo tocando el ya existente.

Por ejemplo entre las etiquetas <presets> y </presets> añadiremos lo siguiente:

<preset id="Proyectos-dashboard">
      <components>
         <!-- title -->
         <component>
            <scope>page</scope>
            <region-id>title</region-id>
            <source-id>site/${siteid}/dashboard</source-id>
            <url>/components/title/collaboration-title</url>
         </component>
         <!-- navigation -->
         <component>
            <scope>page</scope>
            <region-id>navigation</region-id>
            <source-id>site/${siteid}/dashboard</source-id>
            <url>/components/navigation/collaboration-navigation</url>
         </component>
         <!-- dashboard components -->
         <component>
            <scope>page</scope>
            <region-id>component-1-1</region-id>
            <source-id>site/${siteid}/dashboard</source-id>
            <url>/components/dashlets/site-welcome</url>
         </component>
         <component>
            <scope>page</scope>
            <region-id>component-2-1</region-id>
            <source-id>site/${siteid}/dashboard</source-id>
            <url>/components/dashlets/docsummary</url>
         </component>
         <component>
            <scope>page</scope>
            <region-id>component-2-2</region-id>
            <source-id>site/${siteid}/dashboard</source-id>
            <url>/components/dashlets/activityfeed</url>
         </component>
         <component>
            <scope>page</scope>
            <region-id>component-3-1</region-id>
            <source-id>site/${siteid}/dashboard</source-id>
            <url>/components/dashlets/site-profile</url>
         </component>
         <component>
            <scope>page</scope>
            <region-id>component-3-2</region-id>
            <source-id>site/${siteid}/dashboard</source-id>
            <url>/components/dashlets/colleagues</url>
         </component>
         <component>
            <scope>page</scope>
            <region-id>component-3-3</region-id>
            <source-id>site/${siteid}/dashboard</source-id>
            <url>/components/dashlets/site-links</url>
         </component>
      </components>
      <pages>
         <page id="site/${siteid}/dashboard">
            <title>Project Site Dashboard</title>
            <title-id>page.siteDashboard.title</title-id>
            <description>Project site's dashboard page</description>
            <description-id>page.siteDashboard.description</description-id>
            <template-instance>dashboard-3-columns</template-instance>
            <authentication>user</authentication>
            <properties>
                <sitePages>[{"pageId":"documentlibrary"}]</sitePages>
            </properties>
         </page>
      </pages>
   </preset>

   
Con esto hemos declarado un dashboard en el que sólo nos mostrará en la barra de navegación del sitio la Biblioteca de documentos y la lista de miembros (esta última viene por defecto).

Ahora tocaremos el dashboard del usuario dejandolo así:

   <preset id="user-dashboard">
      <components>
         <!-- title -->
         <component>
            <scope>page</scope>
            <region-id>title</region-id>
            <source-id>user/${userid}/dashboard</source-id>
            <url>/components/title/user-dashboard-title</url>
         </component>
         <component>
             <scope>page</scope>
             <region-id>component-1-1</region-id>
             <source-id>user/${userid}/dashboard</source-id>
             <url>/components/dashlets/my-activities</url>
          </component>
         <component>
            <scope>page</scope>
            <region-id>component-2-1</region-id>
            <source-id>user/${userid}/dashboard</source-id>
            <url>/components/dashlets/my-profile</url>
         </component>
         <component>
            <scope>page</scope>
            <region-id>component-3-1</region-id>
            <source-id>user/${userid}/dashboard</source-id>
            <url>/components/dashlets/my-sites</url>
         </component>
      </components>
      <pages>
         <page id="user/${userid}/dashboard">
            <title>User Dashboard</title>
            <title-id>page.userDashboard.title</title-id>
            <description>Users dashboard page</description>
            <description-id>page.userDashboard.description</description-id>
            <template-instance>dashboard-3-columns</template-instance>
            <authentication>user</authentication>
         </page>
      </pages>
   </preset>

De esta forma cada vez que creemos un usuario solo aparecerán los tres dashlets que hemos especificado. Para este caso será "mi perfil, ultimos movimientos y mis sitios".

Ahora pasaremos a configurar el archivo , que sirve para que nuestro share sepa que le hemos añadidos nuestros dahsboards personalizados.

create-site.get.js


Lo único que debemos hacer es indicarle la referencia de lo que hemos añadido.


Para ello hay que añadir lo siguiente:


{id: "Proyectos-dashboard", name: msg.get("title.Proyectos")}


title.Proyectos va a ser el label que le asociamos a ese parámetro para que muestre la traducción que nosotros queramos (lo que ahora configuraremos en el archivo create-site.get.properties).


De forma que se quedaría el archivo de la siguiente manera: 



var sitePresets = [ {id: "site-dashboard", name: msg.get("title.collaborationSite")}, 
{id: "Proyectos-dashboard", name: msg.get("title.docProyectos")}
 ];
 
model.sitePresets = sitePresets;

create-site.get.properties


En este archivo indicaremos la traducción que va a tener los labels que hemos indicado en el código que hemos ido modificando. Abrir el archivo y añadid lo siguiente:


####Traducción de Proyectos####
title.Proyectos=Proyectos


Ya no tenemos que tocar más archivos.


Ahora lo que debéis hacer es simplemente, para ver el dashboard con los 3 dashlets como hemos configurados, debemos crear un usuario nuevo. Recordad que se aplica desde que hacéis la modificación, a los usuarios anteriores no. Además si ahora creáis un sitio en el desplegable debe apareceros como opción "Proyectos", una vez se cree, cargará el dashboard que hemos configurado :-)


Animáos y haced la prueba, ya veréis los resultados ^__^


Por cierto, qué decir que este blog aunque lo escribe una servidora estoy abierta a cualquier sugerencia, o si os animáis y queréis que publique algún post vuestro, no tenéis más que decirlo. La idea es ayudarnos entre todos... Así aprendo yo, y tú ;)


Espero que os haya servido de ayuda, al menos para tener un punto de partida y empezar a tocar los sitios y su creación.


Un saludo.

Search

Cargando...

Seguidores

Visitas