Blog tecnico

Blog técnico

 

 

Integración de Alfresco con Google Docs

Integración de Alfresco con Google Docs

Alfresco

Alfresco permite integrar Google Docs con el propio gestor documental de la empresa, de modo que los documentos de Google Docs puedan gestionarse desde Alfresco, y viceversa.

 

Existen muchos tutoriales en la red que explican cómo realizar esta integración entre Google Docs y Alfresco. Sin embargo, hemos comprobado que en algunas versiones de Alfresco, esta integración no funciona directamente, sino que es necesario realizar algunos pasos adicionales. En concreto, vamos a ver un ejemplo de los pasos que hay que dar para integrar Alfresco Community 4.0.e con Google Docs a día de hoy (usaremos la consola de Alfresco Share):

 

En primer lugar, vamos a realizar la integración normal, tal como se explica, por ejemplo, en el blog de Fegor:

 

1. Propiedades: Editamos nuestro fichero alfresco-global.properties, que estará en $TOMCAT_DIR/shared/classes y le añadimos unas líneas como estas:

 

googledocs.googleeditable.enabled=true

googledocs.application.name=Alfresco ECM system

googledocs.url=https://docs.google.com/feeds/default/private/full

googledocs.downloadurl=https://docs.google.com/feeds/download

googledocs.username=eticco.alfresco@gmail.com

googledocs.password=xxxxxxx

googledocs.spreadsheet.service.name=wise

 

Lógicamente, las propiedades googledocs.username y googledocs.password deben pertenecer a una cuenta de Google Docs gestionada por nuestra organización.

 

2. Usuarios y permisos: Antes de reiniciar Alfresco, podemos crear un usuario de ejemplo que será el que use Google Docs. Estos usuarios deben tener cuenta de Google para poder utilizar la integración. Así, desde la consola http://host:port/share (por ejemplo, http://localhost:8080/share), entramos con el usuario administrador y creamos un usuario desde Más >> Usuarios >> Nuevo usuario.

 
Cuenta de correo de Google
 

Aprovechamos este paso también para crear una carpeta 'Ejemplo' en el repositorio y darle, por ejemplo, el rol de 'Colaborador' al usuario recién creado, para que pueda subir y manipular los documentos (entre otras cosas).

 
Permisos
 

Antes de reiniciar, iniciamos sesión con el nuevo usuario para poder editar, en su perfil, los datos de la cuenta de Google del usuario, y le asignamos una. Como decíamos antes, estas cuentas deben existir y debemos tener acceso a ellas. Además, al usuario admin le asignamos la misma dirección de correo que hemos puesto en la propiedad googledocs.username del alfresco-global.properties (en este ejemplo sería eticco.alfresco@gmail.com). Alfresco lo que va a hacer es que el usuario configurado en alfresco-global.properties cree realmente los documentos en Google Docs y los comparta con los usuarios de Alfresco que tengan permiso de lectura sobre ellos.

 

Editar perfil

 

3. Comprobaciones I. Reiniciamos el Tomcat y, en teoría, ya debería funcionar la integración! Para comprobarlo, sólo tenemos que entrar como el usuario creado (no admin), ir a la carpeta 'Ejemplo' y seleccionar 'Crear contenido' > 'Google Docs Documento', por ejemplo.

Nuevo Google Doc

Le damos un nombre al documento y después, en los detalles, escogemos "Subir a Google Docs". En una nueva pestaña se abre el documento y podemos editarlo y guardar los cambios en Google Docs, de modo que parecería que todo funciona correctamente. La última comprobación, sería tratar de recuperar el documento desde Alfresco, con la opción 'Descargar de Google Docs'. Si lo hace correctamente, enhorabuena: ya están integrados Alfresco y Google Docs!! Si, como en nuestro caso, no hace nada y sale un error como este en el log del Tomcat:

 

com.google.gdata.util.ResourceNotFoundException: Not Found

 

Tendremos que dar un par de pasos más. Ese error se da porque la ruta en la que Alfresco Community 4.0.e trata de descargar el documento de Google Docs no es correcta (de ahí el Resource not found). La mala noticia es que no es por la parte de la ruta que configuramos en alfresco-global.properties, es decir, https://docs.google.com/feeds/download, sino por el sufijo que Alfresco añade detrás para cada tipo de documento. Y lo malo es que ese sufijo viene hardcodeado en el código del servicio de Alfresco. ¿Cómo podemos solucionarlo? Pues con una de las ventajas de los productos OpenSource: que tenemos todo el código a nuestra disposición.

 

4. Localización de las cosas a cambiar. Sin entrar en mucho detalle sobre cómo funciona Alfresco (no nos interesa en este post, pero tal vez le dediquemos una entrada posterior), sí diremos que utiliza beans de Spring para su configuración, de forma que, mediante ficheros de XML, se decide qué clase concreta implementará cada servicio de Alfresco. En este caso, podemos encontrar la clase que implementa el servicio en $TOMCAT_DIR/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/googledocs/default/googledocs-context.xml. Vemos que es org.alfresco.repo.googledocs.GoogleDocsServiceImpl. Copiamos en nuestro equipo tanto el fichero googledocs-context.xml del Tomcat, como la clase GoogleDocsServiceImpl de la versión 4.0.e, que podemos obtener del repositorio de Alfresco (en esta entrada podemos ver, entre otras cosas, cómo descargar código del repositorio de Alfresco) y con eso ya tenemos todo lo que necesitamos.

 

5. Modificación del contexto. Lo que vamos a hacer es crear una clase que haga lo mismo que la de Alfresco, pero utilizando las rutas correctas. Para ello, primero tenemos que crear un fichero XML que le indique a Alfresco que utilice nuestra clase en lugar de la que tiene por defecto. Creamos esta ruta en $TOMCAT_DIR/shared/classes: alfresco/extension/subsystems/googledocs/default/default y copiamos dentro el fichero googledocs-context.xml del paso anterior. Le cambiamos el nombre por custom-googledocs-context.xml (por convenio) y lo editamos, cambiando la clase "org.alfresco.repo.googledocs.GoogleDocsServiceImpl" por la nuestra (en este caso: com.eticco.alfresco.repo.googledocs.GoogleDocsServiceImpl). Alfresco siempre da más prioridad a nuestros ficheros de configuración que a los suyos, precisamente para poder extender o sobrescribir este tipo de cosas.

 

6. Modificación del código. Sobre la clase que nos descargamos del repositorio únicamente hay que cambiar las líneas de la 687 a la 694, es decir, estas:

                    if (docType.equals(TYPE_DOCUMENT) || docType.equals(TYPE_PRESENTATION))
                    {
                        StringBuffer buffer = new StringBuffer(this.downloadUrl);
                        buffer.append("/").
                               append(docType).append("s").
                               append("/Export?docId=").append(document.getDocId()).
                               append("&exportFormat=").append(fileExtension);     
                        
                        downloadUrl = buffer.toString();
                    }
 
Por estas:
 
                    if (docType.equals(TYPE_DOCUMENT))
                    {
                        StringBuffer buffer = new StringBuffer(this.downloadUrl);
                        buffer.append("/").
                               append(docType).append("s").
                               // append("/Export?docId=").append(document.getDocId()). <-- Esa era la línea original de Alfresco, pero no funciona porque Google ha cambiado la url!
                               append("/export/Export?id=").append(document.getDocId()).
                               append("&exportFormat=").append(fileExtension);     
                        
                        downloadUrl = buffer.toString();
                    } // He tenido que separar TYPE_DOCUMENT de TYPE_PRESENTATION, porque no usan la misma url...
                    else if (docType.equals(TYPE_PRESENTATION))
                    {
                        StringBuffer buffer = new StringBuffer(this.downloadUrl);
                        buffer.append("/").
                               append(docType).append("s").
                               // append("/Export?docId=").append(document.getDocId()). <-- Esa era la línea original de Alfresco, pero no funciona porque Google ha cambiado la url!
                               append("/Export?id=").append(document.getDocId()).
                               append("&exportFormat=").append(fileExtension);     
                        
                        downloadUrl = buffer.toString();
                    }

 

Podéis ver cuál es el cambio que hacemos que, como comentábamos, consiste en cambiar el sufijo de la url de descarga. Después, habrá que asignarle el package (en nuestro caso com.eticco.alfresco.repo.googledocs), reorganizar los imports, compilar la clase y meterla dentro del contexto de la aplicación Alfresco, por ejemplo dentro de un jar en WEB-INF/lib o, mejor, mediante los paquetes AMP con los que Alfresco recomienda extender su producto.

 

7. Comprobaciones II. Reiniciamos el Tomcat y, ahora sí, funciona la integración de Alfresco 4.0.e con Google Docs (Drive), incluyendo la descarga de los documentos desde Google Docs!!

 

Subir a Google Docs