Alfresco – Añadiendo contenido desde nuestras aplicaciones Java

3
28606

 

Alfresco – Añadiendo contenido desde nuestras aplicaciones Java

 

0. Índice de contenidos.

 

 

1. Introducción

 

Alfresco es la alternativa de código abierto para la gestión de contenido empresarial (ECM),
proporcionando gestión documental,
colaboración, gestión de registros, gestión de información, gestión del contenido web e imágenes. En esta ocasión de entre todas las posibilidades que
ofrece Alfresco vamos a fijarnos en la gestión documental.
La gestión documental de Alfresco captura, comparte y retiene contenido,
permitiendo a los usuarios versionar, buscar y crear de forma sencilla sus propias aplicaciones de contenido,
todo ello con las herramientas utilizadas hoy en día. Sin embargo no siempre es productivo que manejemos todos nuestro contenidos con Alfresco ya que podemos
perder el control sobre la información especifica que define cada unos de los contenidos que añadimos.

Por eso es una buena opción tener aplicaciones Java
que manejen todos los datos referentes
a los contenidos que deseamos añadir sin que Alfresco tenga por que saber nada de los mismos.
Este tutorial no pretende tratar Alfresco en profundidad, sino mostrar cómo dar nuestros los primeros pasos en la comunicación
entre nuestras aplicaciones web y Alfresco.

Antes de empezar, os recomiendo que sigáis el siguiente tutorial de nuestro compañero Víctor Instalación Alfresco (Labs)

 

Dado que ciertas imágenes son demasiado grandes, aquellas que tengan un icono en la parte inferior derecha, podrán ser redimensionadas si se pulsa en ellas.

 

2. Entorno

 

El tutorial está escrito usando el siguiente entorno:

 

  • Hardware: Portátil Dell Latitude E5500(Core Duo T9550 2.66GHz, 4GB RAM, 340 GB HD)
  • Sistema operativo: Windows XP.
  • JDK 1.6.0_1
  • Eclipse ganymede
  • Maven 2.1.0
  • Alfresco Comunity Edition 3.2
  • SDK Alfresco 3.2
  • Tomcat 6.0.18

3. Configuración

 

Para poder llevar a cabo el web services que comunique nuestra aplicación con Alfresco lo primero que debemos hacer es instalar
en el repositorio local de maven las siguientes librerías:

  • Alfresco-repository-3.2.jar
  • Alfresco-web-client-3.2.jar

 

Actualmente no hay ningún repositorio público de Maven para descargarse estos jar y ver las referencias que debiésemos poner en nuestros pom.xml. Sin embargo podemos encontrarlos
en el directorio de instalación de Alfresco /Alfresco-community-sdk-3.2/lib/server A continuación vemos como instalarlos:

 

Copiamos las librerías en otro directorio, en C por ejemplo, renombramos estos jar quitándole del nombre de fichero la versión. Este paso es opcional pero muy recomendable
para evitar la redundancia en nuestro repositorio local. De esta manera no aperecerá la versión en los artifacId.

Ahora desde línea de comandos nos situamos en el directorio donde se encuentran los jar y ejecutamos:

mvn install:install-file -Dfile=Alfresco-web-service-client.jar -DgroupId=com.Alfresco  -DartifactId=Alfresco-web-service-client -Dversion=3.2 -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -Dfile=Alfresco-repository.jar -DgroupId=com.Alfresco  -DartifactId=Alfresco-repository -Dversion=3.2 -Dpackaging=jar -DgeneratePom=true

4. Creando Contenido

 

Una vez instaladas las librerías necesarias construimos la clase que manejará la comunicación
con Alfresco. En un principio nos vamos a servir del ejemplo que proponen en el SDK de Alfresco, ya que
es un ejemplo sencillo, perfecto para comenzar.

**
 * Comunica con Alfresco
 * @author Autentia
 *
 */
public class AlfrescoComunication
{

     public static void addContent()  throws Exception{
        
        //Iniciamos la sesion
        AuthenticationUtils.startSession("admin", "admin");	
        
         try
        {
        	// Creamos la referencia del nodo padre, donde se añadirá  el contenido
        	// En este caso el nodo padre es company_home
            Store storeRef = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
            ParentReference companyHomeParent = new ParentReference(storeRef, null, "/app:company_home", Constants.ASSOC_CONTAINS, null);

            // Asignamos un nombre para el nodo que vamos a crea en company_home
            String name = "Web Services sample (" + System.currentTimeMillis() + ")";
            companyHomeParent.setChildName("cm:" + name);
            
            // Comienza la construcción de nodo 
            
            NamedValue[] contentProps = new NamedValue[1]; 
            contentProps[0] = Utils.createNamedValue(Constants.PROP_NAME, name); 
            CMLCreate create = new CMLCreate("1", companyHomeParent, null, null, null, Constants.TYPE_CONTENT, contentProps);
            
            // Añadimos aspectos al nodo
            
            NamedValue[] titledProps = new NamedValue[2];
            titledProps[0] = Utils.createNamedValue(Constants.PROP_TITLE, name);
            titledProps[1] = Utils.createNamedValue(Constants.PROP_DESCRIPTION, name);
            CMLAddAspect addAspect = new CMLAddAspect(Constants.ASPECT_TITLED, titledProps, null, "1");
            
            
            // Contruimos CML Block, con el nodo y sus aspectos
            
            CML cml = new CML();
            cml.setCreate(new CMLCreate[] {create});
            cml.setAddAspect(new CMLAddAspect[] {addAspect});

            
            // Creamos y recuperamos el contenido vía Repository Web Service
            
            UpdateResult[] result = WebServiceFactory.getRepositoryService().update(cml);     
            Reference content = result[0].getDestination();

            //
            // Escribimos el contenido
            //
            
            ContentServiceSoapBindingStub contentService = WebServiceFactory.getContentService();
            String text = "The quick brown fox jumps over the lazy dog";
            ContentFormat contentFormat = new ContentFormat("text/plain", "UTF-8");
            contentService.write(content, Constants.PROP_CONTENT, text.getBytes(), contentFormat);
            
        }
        
        finally
        {
            // Finalizamos la sesión
            AuthenticationUtils.endSession();

        }    
     
     }
}

Revisemos el método addContent:

     

  • Inicia la sesión con alfreso
...  
  AuthenticationUtils.startSession("admin", "admin");	
...

Pasando como parámetros el usuario y password por defecto para Alfresco.

     

  • Recupera la referencia al nodo donde se creará el contenido
...  
   Store storeRef = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
   ParentReference companyHomeParent = new ParentReference(storeRef, null, "/app:company_home", Constants.ASSOC_CONTAINS, null);
...

Es importante destacar que Alfresco, por defecto
define un conjunto de espacios y nodos donde añadir el nuevo contenido. Para el ejemplo añadiremos el nuevo contenido en el nodo company_home
que se encuentra en el espacio SpaceStore. Como vemos se recupera la referencia al espacio de trabajo y a continuación la referencia al nodo del
que colgará el nuevo contenido.

     

  • Define el nombre para el nodo hijo
 ...
  String name = "Web Services sample (" + System.currentTimeMillis() + ")";  
  companyHomeParent.setChildName("cm:" + name);  
...

Se forma un String con el nombre y se asigna al nodo padre el nombre para el hijo. Como veremos en
las siguientes líneas de código también se utilizará el nombre tanto en la creación del nodo como en la creación de
los aspectos.

     

  • Construye el nodo donde añadiremos el contenido.
 ...   
  NamedValue[] contentProps = new NamedValue[1];   
  contentProps[0] = Utils.createNamedValue(Constants.PROP_NAME, name);   
  CMLCreate create = new CMLCreate("1", companyHomeParent, null, null, null, Constants.TYPE_CONTENT, contentProps);   
...

Se define el nombre para el nodo, el mismo que se había asignado al nodo padre en el paso anterior. Además se
crea el nodo pasando como parámetros el id local para el nodo, la referencia al nodo padre ,el tipo de contenido y
las propiedades definidas para el nodo.

Anteriormente habíamos comentado que Alfresco define una serie de espacios y nodos por defecto. Pues bien, tambien define varios tipos de
contenidos por defecto como por ejemplo el tipo content. Este es el tipo de contenido que le estamos indicando con el parámetro
Constants.TYPE_CONTENT a la hora de crear el nodo.

     

  • Añade aspectos al nodo
...   
    NamedValue[] titledProps = new NamedValue[2];
    titledProps[0] = Utils.createNamedValue(Constants.PROP_TITLE, name);
    titledProps[1] = Utils.createNamedValue(Constants.PROP_DESCRIPTION, name);
    CMLAddAspect addAspect = new CMLAddAspect(Constants.ASPECT_TITLED, titledProps, null, "1");
...

Por el momento y respecto a los aspectos es importante saber que su objetivo principal es añadir funcionalidad a
los tipos de contenidos existentes. Además los aspectos pueden tener propiedades que podremos manejar y que darán forma al contenido
asociado.
Para el ejemplo utilizamos unos de los aspectos definidos en Alfresco Constants.ASPECT_TITLED.Este aspecto posee una serie de
propiedades como usuario_creación , fecha_creación, autor, fecha_modificación etc .. de las cuales modificamos titulo y descripción. Por último
es importante destacar como a la hora de crear el aspecto se pasa como último parámetro «1».Este parámetro es el id_local del nodo que se ha
creado en el paso anterior. De esta forma se asocia el aspecto al contenido

     

  • Crea CML con el nodo y el aspecto
...   
    CML cml = new CML();
    cml.setCreate(new CMLCreate[] {create});
    cml.setAddAspect(new CMLAddAspect[] {addAspect});
...

Se crea el tipo de objeto necesario para crear y recuperar el contenido vía Web Service.

     

  • Crea y recupera el contenido vía Web Service
...   
    UpdateResult[] result = WebServiceFactory.getRepositoryService().update(cml);     
    Reference content = result[0].getDestination();
...

Se crea el contenido en Alfresco y se recupera su referencia. Esto nos permitirá poder
escribir dicho contenido como vemos a continuación.

     

  • Escribe el contenido

...   
    ContentServiceSoapBindingStub contentService = WebServiceFactory.getContentService();
    String text = "The quick brown fox jumps over the lazy dog";
    ContentFormat contentFormat = new ContentFormat("text/plain", "UTF-8");
    contentService.write(content, Constants.PROP_CONTENT, text.getBytes(), contentFormat);
...

Destacamos como a la hora de escribir el contenido se indica la referencia del contenido, el tipo y la
codificación del documento, los bytes de información y que va a ser un contenido.

 

5. La aplicación.

 

Nuestra aplicación es muy sencilla.Consta de una pantalla donde podremos seleccionar un documento del sistema.Recuperaremos
el nombre y el tipo de archivo,y añadiremos como información adicional el titulo y la descripción del documento.Podría ser algo
como:

Cuando hagamos click el botón de Añadir contenido pasaremos por el método de acción correspondiente
en nuestro controlador para esta pantalla y se llamará al método addContent definido anteriormente en la clase
AlfrescoComunication, aunque con algunas modificaciones
que nos permitirán añadir como contenido en Alfresco distintos tipos de documentos asignándoles el nombre, el titulo y
la descripción.

A continuación vemos como quedaría la nueva versión del método:

public class AlfrescoComunication {
		
	
	  private static String URL_SERVER  = "http://localhost:8280/Alfresco/api";
	
public static void addContent(String nameFile, String typeFile, String title, String description, byte[] filebytes)  throws Exception{
        
		
		setServerUrl(URL_SERVER);
        //Iniciamos la sesión
        AuthenticationUtils.startSession("admin", "admin");	
        
         try
         
         
        {
        	
        	 
        	 
        	 // Creamos la referencia del nodo padre, donde se añadira el contenido
        	// En este caso el nodo padre es company_home
            Store storeRef = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
            ParentReference companyHomeParent = new ParentReference(storeRef, null, "/app:company_home", Constants.ASSOC_CONTAINS, null);

            // Asignamos un nombre para el nodo que vamos a crea en company_home
            String name = "Web Services sample (" + System.currentTimeMillis() + ")";
            companyHomeParent.setChildName("cm:" + name);
            
            // Comienza la construcción de nodo 
            
            NamedValue[] contentProps = new NamedValue[1]; 
            contentProps[0] = Utils.createNamedValue(Constants.PROP_NAME, nameFile); 
            CMLCreate create = new CMLCreate("1", companyHomeParent, null, null, null, Constants.TYPE_CONTENT, contentProps);
            
            // A?adimos aspectos al nodo
            
            NamedValue[] titledProps = new NamedValue[2];
            titledProps[0] = Utils.createNamedValue(Constants.PROP_TITLE, title);
            titledProps[1] = Utils.createNamedValue(Constants.PROP_DESCRIPTION, description);
            CMLAddAspect addAspect = new CMLAddAspect(Constants.ASPECT_TITLED, titledProps, null, "1");
            
            
            // Contruimos CML Block, con el nodo y sus aspectos
            
            CML cml = new CML();
            cml.setCreate(new CMLCreate[] {create});
            cml.setAddAspect(new CMLAddAspect[] {addAspect});

            
            // Creamos y recuperamos el contenido vía Repository Web Service
            
            UpdateResult[] result = WebServiceFactory.getRepositoryService().update(cml);     
            Reference content = result[0].getDestination();

            //
            // Escribimos el contenido
            //
            
            ContentServiceSoapBindingStub contentService = WebServiceFactory.getContentService();
            ContentFormat contentFormat = new ContentFormat(typeFile, "UTF-8");
            contentService.write(content, Constants.PROP_CONTENT, filebytes, contentFormat);
            
        }
        
        finally
        {
            // Finalizamos la sesión
            AuthenticationUtils.endSession();

        }    
     
     }



/**
* Estaclece la url al servidor de Alfresco
* @param AlfrescoServerUrl
*/
	private static  void setServerUrl(String AlfrescoServerUrl) {
		WebServiceFactory.setEndpointAddress(AlfrescoServerUrl);
	}


}

Podemos observar que la única diferencia son los parámetros que hemos recogido desde el interfaz de usuario. Es importante destacar
que además de las propiedades que se ven por pantalla cuando seleccionamos un fichero recuperamos sus bytes para pasarlo como parámetro
junto con el resto y así poder escribir el contenido correctamente y de forma independiente del tipo de fichero seleccionado.

 

6. Comprobando el resultado.

 

Una vez tenemos nuestra aplicación en funcionamiento y hemos añadido algún documento como contenido de Alfresco vamos a ver
cuál ha sido el resultado. Para ello accedemos ha Alfresco:

 

Nos logueamos y accedemos desde el menú lateral de la izquierda a Company Home, podremos comprobar gratamente como se encuentra
el documento que hemos añadido desde nuestra aplicación y podremos ver que se ha creado con el nombre ,el titulo y la descripción que
le hemos facilitado.

 

 

Como vemos se ha creado correctamente el contenido con el documento que hemos seleccionado desde la aplicación, podemos comprobar que en este caso
la imagen se ve correctamente y además se simboliza con el icono correspondiente
para las imágenes.

 

7. Conclusiones.

 

Como había comentado al principio del tutorial, no he pretendido tratar temas de Alfresco en profundidad ni mucho menos. Solamente he intentado
mostrar cómo podemos sacarle mas partido a una herramienta que en su categoría esta de moda, pero que por si sola quizás no sea capaz de adaptarse
a ciertos modelos de negocio, sobre todo ha aquellos que ya están predefinidos con anterioridad y que se basan en otras aplicaciones de gestión
desarrolladas en Java por ejemplo. Sin embargo con esto no estoy desmereciendo la herramienta ya que como veremos en futuros tutoriales Alfresco
es una herramienta potente y con mucha miga que tratar(Creación de contenidos personalizados, creación de aspectos, búsquedas, búquedas avanzadas,
reglas de acción asociadas al contenido o a los aspectos, etc).

Hoy hemos visto como añadir contenido, pero también veremos como realizar
búsquedas y como borrar contenidos de Alfresco desde nuestra aplicación.

Como veís quedan muchas cosas en el tintero que espero ir contando en próximos tutoriales. Hasta entonces espero que les sirva de utilidad esta primera
aproximación a Alfresco y su conexión con aplicaciones Java.

 

Un saludo.

 

Saúl

 

Correo a: sgdiaz@autentia.com

 

3 COMENTARIOS

  1. hola saul…

    primeramente quiero felicitarte a ti y todos los integrantes de AUTENTIA ..

    tengo una duda ..tengo una aplicación con ICEFACES 1.8 desarrollada con netbeans 6.5 y server Glassfish..como hago para las librerías necesarias si no estoy utilizando maven.. y además como le indico a alfreco en que lugar de la página debo ubicar los contenidos ya sean imágenes, texto..etc

    de antemano MUCHAS GRACIAS!!

    SALUDOS!!!

  2. Saludos, estoy empezando a usar ALFRESCO y estoy tratando de subir un archivo desde JAVA, mi pregunta es que método utiliza o de que forma obtiene los byte[].

    Saludos

  3. Hola buenas tardes. Estoy empezando a usar Alfresco y necesito un poco de ayuda con respecto a la eliminación o deshabilitación de los botones de: comentarios, me gusta, compartir…
    Estoy trabajando en un requerimiento bastante extenso que consiste en extraer datos desde ephesoft y enviarlos a Alfresco solo en modo de consulta para usuarios invitados. Esos usuarios no deberían tener las opciones antes mencionadas ni las de favoritos y mas… No se si pudiera contactarme con ustedes por cualquier otro medio para recibir ayuda. O recibir algún curso o entrenamiento si fuera necesario estoy realmente interesada ya que mis pasantias dependen enteramente de este requerimiento.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad