Activar Auditoría en Alfresco 3.3

[Actualizado el 7/10/2010 a las 15:30]

La documentación sobre auditoría en Alfresco 3.3 es bastante pobre porque llegó en un momento de transición de la 3.2 al nuevo sistema con servicios y de todo en la 3.4.

Para activar la auditoría se añadirán las siguientes opciones en

alfresco-global.properties

# Auditing
# Audit configuration
# from: alfresco/repository.properties
audit.enabled=true
audit.tagging.enabled=true
audit.repository.enabled=true
audit.cmischangelog.enabled=true
# Setting this flag to true will cause alfresco/auditConfig.xml to be ignored
# when audit is enabled. When false both alfresco/auditConfig.xml and
# alfresco/audit/*.xml will be used.
audit.useNewConfig=false
# Setting this flag to true will force startup failure when invalid audit configurations are detected
audit.config.strict=false

y activar también la auditoría en el siguiente fichero:

auditConfig.xml

<Audit xmlns="http://www.alfresco.org/model/audit/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" enabled="true" auditInternal="false" mode="all">

 

Esto activa la auditoría antigua, pues la nueva no he conseguido que funcione.

La información de auditoría en Alfresco 3.3 se almacena en base de datos.

Para ver estos datos se pueden usar estas consultas de ejemplo:

(Queries para Informix, sí Informix, qué se le va a hacer)

Encontrar usuarios que nunca han entrado o hecho nada para ser auditado:

select *
 from alf_audit_fact fact
 right outer join alf_node_properties prop on fact.user_id = prop.string_value
 where prop.qname_id = 44
 and fact.user_id is null ;

Encontrar todo el contenido que ha sido “visto por un usuario en los últimos 7 días:

select *
 from alf_audit_fact fact
 join alf_audit_source source
 on fact.audit_source_id = source.id
 and (
 (source.service = 'ContentService' and source.method = 'getReader')
 or (source.service = 'FileFolderService' and source.method = 'getReader')
)
 where
 fact.user_id = 'admin'
 and fact.timestamp > DATE(DATE(CURRENT)-7)
 order by fact.id asc ;

Para el metodo crearNodo sería:

or (source.service = 'NodeService' and source.method = 'createNode')

Lista de metodos disponibles desde la tabla alf_audit_source

id application service methd
15 SystemMethodInterceptor NodeService createNode
 17 SystemMethodInterceptor RuleService disableRules
 28 SystemMethodInterceptor RuleService enableRules
 47 SystemMethodInterceptor ContentService getWriter
 64 SystemMethodInterceptor PermissionService setPermission
 66 SystemMethodInterceptor NodeService addAspect
 98 SystemMethodInterceptor PermissionService setInheritParentPermissions
 244 SystemMethodInterceptor NodeService setProperty
 2468 SystemMethodInterceptor NodeService addChild
 2698 SystemMethodInterceptor WorkflowService deployDefinition
 2998 SystemMethodInterceptor NodeService setProperties
 3220 SystemMethodInterceptor AuthenticationService authenticate
 3222 SystemMethodInterceptor AuthenticationService invalidateTicket
 3251 SystemMethodInterceptor AuthorityService createAuthority
 3282 SystemMethodInterceptor PersonService createPerson
 3286 SystemMethodInterceptor AuthenticationService createAuthentication
 3288 SystemMethodInterceptor AuthenticationService setAuthenticationEnabled
 3293 SystemMethodInterceptor AuthorityService addAuthority
 3370 SystemMethodInterceptor AuthenticationService validate
 24934 SystemMethodInterceptor AuthenticationService authenticateAsGuest
 25156 SystemMethodInterceptor FileFolderService getReader
 25174 SystemMethodInterceptor NodeService deleteNode
 25780 SystemMethodInterceptor TemplateService buildDefaultModel
 25782 SystemMethodInterceptor ContentService getReader
 25784 SystemMethodInterceptor TemplateService processTemplate

Más información de Auditoría para Alfresco 3.3
http://wiki.alfresco.com/wiki/Auditing_%28from_V3.2r%29

Espero que haya servido de ayuda.

Explicación de la arquitectura de Alfresco

Recientemente en un cliente hemos necesitado explicar cómo es la arquitectura de sistemas de Alfresco.

La estructura de espacios en Alfresco no es la estructura “física” con la que los documentos se graban en disco. No replica exactamente la distribución que hagamos por carpetas en el sistema de ficheros. (Ver presentación más abajo)

La estructura de carpetas es “lógica” por tanto, pero de cara al usuario es así como los documentos se distribuyen por el repositorio y así los mostrará en un posible acceso por unidad de red de windows, o webdav, o un arbol de directorios.

Otras vistas que podemos realizar a partir de otros elementos de clasificación como las categorías, nubes de tags, o búsquedas prediseñadas en función de tipos de documento o un valor de un metadato, son visibles para el usuario, pero a través de otros sistemas.
Estas vistas podrían ser la la propia interfaz web de Alfresco Share o vistas diseñadas por nosotros a partir de los servicios que ofrece.

En todo caso no habría nunca ningún perjuicio en el rendimiento de Alfresco por clasificar los documentos en carpetas o por nube de tags, todo es transparente para las búsquedas, que únicamente se basan en los índices que se generan automáticamente.

La única recomendación de rendimiento a este nivel que nos da Alfresco es respetar en la estructura de carpetas el número máximo de 1000 nodos por nivel. Es importante en accesos que muestren el árbol de directorios como acceder con Alfresco Share, Alfresco Explorer, CIFS, Webdav, FTP, etc.

Adjunto una pequeña presentación que espero aclare estos conceptos.

Cómo visualizar recursos de tipo espacio en workflows avanzados

En esta entrada ya hablamos de workflows para espacios (folder o space)

El problema es que una vez creado no se ven este tipo de recursos en los detalles del workflow.
Para poder verlos hay que modificar en el alfresco-web-client.jar, el fichero org/alfresco/web/bean/workflow/ManageTaskDialog.java.
Este fichero, en la línea 716, ya está puesto un comentario que nos indica que se filtran los elementos de tipo folder.

// NOTE: folders within workflow packages are ignored for now
if (this.dictionaryService.isSubClass(type, ContentModel.TYPE_CONTENT) ||
ApplicationModel.TYPE_FILELINK.equals(type))
{

Si descomentamos, todos los recursos ya se pueden ver, pero el enlace no funciona correctamene.
Para solucionarlo hay que reescribir la generación de los enlaces.

Los ficheros que he modificado es el org/alfresco/web/bean/workflow/ManageTaskDialog.java (que se compila en el su libreria alfresco-web-client.jar) y alfresco/jsp/workflow/manage-task-dialog.jsp, que se distribuye directamente en ese directorio de alfresco.

ManageTaskDialog.java
manage-task-dialog.jsp

Espero que sea de ayuda.

Alfresco. Duplicate Child Node Name Exception y Versionado (checkin/checkout)

Al mover o crear un nodo, nos podemos encontrar con un error de que ya existe un nodo con este nombre. Para resolver esta excepción tenemos varias opciones:

  • No hacer nada
  • No moverlo
  • Borrar el destino y luego moverlo
  • Moverlo con otro nombre
  • O, la opción más elegante, incrementar la versión del documento haciendo checkin, checkout

Basándome en este post lo probé y llegué a este código, que ya pongo en la respuesta, y que cuento a continuación:

El principio es este:

You should design your script to:
* Check out a working copy of your versioned node.
* Use the new write method to update the content of your working copy.
* Check in your working copy.

Y esta es la solución en código:
(Está en inglés)

This is a move function, that detects if a node already exists
(Variables are in spanish)


// Moves a node to a destination
function moveNode (nodo, destino) {
// Search if exists
var encontrado = destino.childByNamePath(nodo.name);
if (encontrado != null) {
if (! encontrado.hasAspect("cm:versionable")) {
encontrado.addAspect("cm:versionable");
}
var wc = encontrado.checkout();
wc.properties["cm:content"]=nodo.properties["cm:content"];
wc.save();
wc.checkin("Update element: "+nodo.name);
nodo.remove();
}
else
{
nodo.move(destino);
}
}

This only has a problem, increases two versions each time. I guess wc.save(), make his part in it, while we are updating that node.

I hope this helps

Desplegar un workflow a Alfresco desde Eclipse

Para no tener que reiniciar Alfresco cada vez que se cambia un workflow, existe la posibilidad de hacer un despliegue desde Eclipse

Para ello usando el plugin de jbpm de Eclipse ( se describe cómo instalarlo en  http://wiki.alfresco.com/wiki/WorkflowAdministration ), cuando se edita un workflow, en la pestaña de Deployment, se rellenan los datos necesarios para que se conecte con el servidor.

Server name: localhost
Server port: 8080
Server deployer:  /alfresco/jbpm/deployprocess

Y se prueba la conexión con el botón Test Connection

Con esto ya se distribuye el workflow sin tener que reiniciar alfresco

Fuente: http://wiki.alfresco.com/wiki/WorkflowAdministration#Deploying_via_JBoss_jBPM_Process_Designer

Worklfow Deployment

Alfresco Workflow Avanzados sobre espacios (folders)

or defecto en Alfresco no se pueden iniciar Workflows Avanzados sobre espacios.

Pero sí se pueden iniciar a través de un script.

Solamente hay que ejecutar este script sobre el espacio

var workflow = actions.create("start-workflow");
workflow.parameters.workflowName = "jbpm$minameserver:miworkflowProcess";
workflow.parameters["bpm:workflowDescription"] = document.name;
workflow.parameters["bpm:assignee"] = person;
var futureDate = new Date();
futureDate.setDate(futureDate.getDate() + 7);
workflow.parameters["bpm:workflowDueDate"] = futureDate;
workflow.execute(document);
 

Actualmente las propiedades de workflow no van a contener a este espacio como datos adjuntos y aparecerá como vacío.

  • Si queremos ejecutar el script ya se hace de la manera habitual

Primero hay que crearlo en
Empresa > Diccionario de datos > Scripts
con el nombre por ejemplo de startWorkflow.js

Después para ejecutarlo se puede hacer de varias maneras, las más habituales son:

  1. Ejecutar el script como acción sobre un elemento. Se accede desde Propiedades del elemento.
  2. Crear una regla para que se ejecute el script cada vez que se cree este espacio

Si al final no era tan difícil… ;-)

Fuente: http://wiki.alfresco.com/wiki/WorkflowAdministration#Step_7:_Integration_with_Rules_.28Optional.29

Alfresco Workflow Console

Cuando se crean nuevos workflows en Alfresco, es habitual querer borrar alguno de vez en cuando, o cambiarle el nombre.

Esto no es problema, salvo que cuando volvemos a entrar después de haberlo quitado de nuestra configuración, el viejo workflow sigue apareciendo en la lista de selección.

Esto es porque está registrado en la base de datos y hay que borrarlo, o más correctamente des-desplegarlo, hacer ‘undeploy’

Para ello siguiendo la información que aparece en http://wiki.alfresco.com/wiki/Workflow_Console, accedemos a la consola en http://localhost:8080/alfresco/faces/jsp/admin/workflow-console.jsp

A través de la consola se pueden hacer muchas operaciones, pero aquí solamente voy a describir el borrado de un workflow.

Para borrar workflows:

  1. Accedemos al listado de variables con la orden:
    show definitions all
  2. Borramos el workflow elegido con:
    undeploy definition name <workflowName>
  • Por ejemplo: undeploy definition name jbpm$mynamespace:reviewProcess

Y eso es todo!

Fuente: http://wiki.alfresco.com/wiki/Workflow_Console

Modificar elementos de alfresco desde código java

Este es precisamente el tipo de cosas por las que cree el blog. He estado unas 8 horas para conseguir una línea de código.

Para poder modificar elementos (nodos) de alfresco desde java, es necesario hacer uso de un servicio interno: NodeService. Y ese servicio se obtiene con esta simple línea, que me ha costado tanto encontrar:

NodeService nodeService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getNodeService();

Una vez con el objeto nodeService ya se pueden crear nodos, borrarlos, o modificar sus propiedades:

//uuid es un String con el uuid que identifica el objeto alfresco

NodeRef nodeRef=new NodeRef(Repository.getStoreRef(), valores.get(uuid));

QName qname=QName.createQName(“{http://www.alfresco.org/model/content/1.0}name”);

nodeService.setProperty(nodeRef, qname, “nuevoNombre”);

Instalación plugin JBPM en Eclipse

Alfresco y sus Workflows ha motivado que queramos instalar el plugin de JBPM en nuestro Eclipse

Alfresco embeds the JBoss jBPM process engine which itself provides the jPDL Process Definition Language.

Qué es JBPM

JBoss jBPM is a flexible, extensible framework for process languages. jPDL is one process language that is build on top of that common framework. It is an intuitive process language to express business processes graphically in terms of tasks, wait states for asynchronous communication, timers, automated actions,… To bind these operations together, jPDL has the most powerful and extensible control flow mechanism.

La sección del manual de Alfresco es bastante clara, aquí, pero no indica correctamente qué bajar y cómo instalarlo.

En esta entrada intentaremos indicar cómo se consigue instalar el plugin de JPBM-jPDL en Eclipse, también conocido como “designer”

  1. Ir a la página de download
[update 23/02/2012] Gracias a Eloweyn se actualiza el link de descarga

y bajarse:

  • (recomendado) jPDL Suite: lo tiene todo. El plugin está dentro del directorio “designer”.

  • (opcional) jBPM GPD: solo el plugin de eclipse para diseñar, pero necesitamos todo

  1. Si hemos bajado Suite, descomprimir el fichero bajado en un directorio definitivo, como /opt/. En otro caso, uno temporal.
  2. Acceder al directorio, por ejemplo:  $ cd /opt/share/jbpm-jpdl-3.2.2/

  3. Acceder al directorio “designer”.

  4. Acceder al directorio eclipse.

  5. Copiar todo lo que hay dentro (plugins, etc) a nuestro directorio de eclipse, donde también están las mismas carpetas, sobreescribiendo con la libertad que uno prefiera. De esta manera se copiará el plugin en nuestro eclipse.

  6. Reinicar eclipse si es el caso.

  7. Y ya tenemos nuestro plugin.

Para usarlo, bonito tutorial en jBoss, pero está incompleto.

  1. New->Project… JBPM.
  2. Nombre del proyecto
  3. Como al principio no tendremos la ubicación del Core JBPM, nos la pide, por ejemplo: /opt/share/jbpm-jpdl-3.2.2/
  4. Y ya está!

Conseguir las fuentes de alfresco

Me ha costado un buen rato, pero al final he conseguido descargar el código fuente de alfresco.

La primera parte ha sido más o menos fácil: Obtener los últimos fuentes :

svn co http://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/HEAD

Pero resulta que la versión final 2.1 community no tiene una rama, sino que es la revision 929. A si que:

svn co http://svn.alfresco.com/repos/alfresco-open-mirror/alfresco/HEAD -r 929

Seguir

Get every new post delivered to your Inbox.