[ Blog ]
[ abuabalras ]
[ Wiki ]
[ Slideshare ]
[ Twitter ]

 

Bloggers recientes

Cesar Capillas Mensajes: 94
Estrellas: 7
Fecha: 3/04/12
Patricia Yagüe Mensajes: 2
Estrellas: 0
Fecha: 2/04/12
Irune Prado Mensajes: 4
Estrellas: 0
Fecha: 27/03/12

noBlogo - El blog de zylk.net

First steps on a digital signature android app integrated with alfresco

We continue developing features for sinadura android client. Last week we added browsing and downloading documents from an Alfresco repository.

So now we can, browse repository, download a remote PDF to the mobile client, sign it with our p12 certificate with timestamp, and update the document in the repo.

Another step/part in Alfresco integration is the validation module for checking signatures, that we showed some weeks ago, using Alfresco as a Digital Signature Validation Service.

http://www.zylk.net/web/guest/web-2-0/blog/-/blogs/alfresco-ecm-working-as-a-simple-digital-signing-service

Creando y gestionando de manera dinámica propiedades de tipo constraint en Alfresco

 

Basándonos en este artículo del blog de Alfresco relativo a propiedades dinámicas en tipos de contenido, hemos desarrollado un sencillo componente para utilizar y gestionar listas dinámicas en uno de nuestros modelos de contenido utilizados en zylk.net.

 

En nuestro caso, tenemos un modelo de contenido para gestionar incidencias o tickets, con un tipo base bug:incidencia, del cual tenemos el siguiente extracto:

 

<type name="bug:incidencia"> 

      <title>Incidencia</title> 
      <parent>cm:folder</parent>
      <properties>
<property name="bug:incidencia_asignar"> 
               <title>Asignar a</title> 
               <type>d:text</type>               
        <constraints>
                 <constraint ref="bug:AsignarIssue" />
               </constraints> 
            </property>
  <property name="bug:incidencia_estado"> 
               <title>Estado</title> 
               <type>d:text</type>             
      <constraints>
                 <constraint ref="bug:EstadosIssue" />
               </constraints> 
            </property>
  <property name="bug:incidencia_prioridad"> 
               <title>Prioridad</title> 
               <type>d:text</type> 
      <constraints>
                 <constraint ref="bug:PrioridadesIssue" />
               </constraints>           
            </property> 
</type>
 

Para las tres propiedades anteriores se utilizan un conjunto de constrains que se definen de manera dinamica a continuación, a partir de una query de lucene sobre el repositorio. Es decir, gestionamos las propiedades en el repositorio (y no en un archivo xml del modelo), y las consumimos mediante querys de lucene.

 

Para asignar incidencia a usuario (person):

 

 <constraint name="bug:AsignarIssue" 
       type="zylk.net.constraints.SearchBasedListConstraint" > 
       <parameter name="query"> 
       <value>TYPE:"{http://www.alfresco.org/model/content/1.0}person"</value> 
       </parameter> 
 </constraint>
 

Para definir los estados de la incidencia (categorías):

 

<constraint name="bug:EstadosIssue" 

 

       type="zylk.net.constraints.SearchBasedListConstraint" > 
      <parameter name="query"> 
      <value>PATH:"/cm:generalclassifiable/cm:Aplicaciones/cm:Bugtracker/cm:Estados//."</value> 
      </parameter> 
 </constraint>
 

Para establecer la prioridad de la incidencia (folders):

 

<constraint name="bug:PrioridadesIssue" 
       type="zylk.net.constraints.SearchBasedListConstraint" > 
       <parameter name="query"> 
       <value>PATH:"/app:company_home/app:dictionary/cm:Aplicaciones/cm:Bugtracker/cm:Prioridades//."</value> 
       </parameter> 
</constraint> 
 

El caso de uso es el siguiente:

 

  • Tenemos un tipo de contenido con una propiedad definida que es variable bug:EstadosIssue y necesita de una administración propia, porque el administrador requiere añadir nuevos valores a esa constraint con cierta frecuencia. Esta problemática se puede gestionar con categorias en Alfresco (pero solo el administrador puede acceder a través de las interfaces de Alfresco Explorer y Share).

  • Tenemos un tipo de contenido con una propiedad definida que es variable bug:PrioridadesIssue y necesita de una administración propia y donde no sólo por los administradores sino un grupo de usuarios va a añadir valores con cierta frecuencia. Esta problemática se puede gestionar con una estructura de carpetas virtual creada por ejemplo en Data Dictionary (con permisos de edicion para el conjunto de usuarios editores)

 

 

La clase que implementará la carga de valores extiende de ListOfValuesConstraint (ver wiki)

 

public class SearchBasedListConstraint extends ListOfValuesConstraint implements Serializable

 

haremos uso del ServiceRegistry para poder llamar a los servicios que necesitamos (SearchService, NodeService...)

 

private static ServiceRegistry registry;
public ServiceRegistry getServiceRegistry()
{
return registry;
}
public void setServiceRegistry(ServiceRegistry registry)
{
SearchBasedListConstraint.registry = registry;
}

tendremos un método que realizará una búsqueda Lucene con una query que pasaremos como parámetro desde el modelo de contenido.

 

protected List<String> getResults()
{
   getServiceRegistry().getAuthenticationService().authenticate("admin", "admin".toCharArray());

   List<String> allowedValues = new ArrayList<String>();
   for (ResultSetRow row : resultSet)
   {
     if(nodeSvc.getType(row.getNodeRef()).equals(ContentModel.TYPE_PERSON)){
     allowedValues.add((String)nodeSvc.getProperty(row.getNodeRef(), ContentModel.PROP_FIRSTNAME) + " "
      + (String)nodeSvc.getProperty(row.getNodeRef(), ContentModel.PROP_LASTNAME));
      }else{
     allowedValues.add((String)nodeSvc.getProperty(row.getNodeRef(), ContentModel.PROP_NAME));
    }
   } 
   if (allowedValues.size() == 0)
    allowedValues.add("");
return allowedValues;
}

 

también es necesario sobreescribir el método getAllowedValues para que cargue los valores obtenidos en la búsqueda:

 

@Override
public List<String> getAllowedValues()
{
List<String> allowedValues = getResults();
super.setAllowedValues(allowedValues);
return allowedValues;
}

y por último, tendremos que tener definido el bean en el contexto:

 

(bug-model-context.xml)
<bean id="SearchBasedListConstraintInitializer" 
class="zylk.net.constraints.SearchBasedListConstraint"> 
<property name="serviceRegistry"> 
<ref bean="ServiceRegistry"/> 
</property> 
</bean>

 

PS: Para desplegar la clase java hemos creado un jar y lo hemos copiado en $ALF_HOME$/tomcat/webapps/alfresco/WEB-INF/lib.

 

 

Ejemplos:

Constraint para usuarios:

 

 

Constraint de categorías:

 

 

Constraint de carpetas:

 

 

Desarrollando aplicaciones J2EE sobre Alfresco IV – Aplicativo final

 

Como colofón a la entrega de 'Desarrollando aplicaciones J2EE sobre Alfresco' [1] [2] [3] , vamos a comentar el caso de éxito de la creación de un aplicativo final para uno de nuestros clientes.

En su antigua vertiente, el cliente hacía uso del software propietario Lotus Notes, sistema cliente/servidor de colaboración y correo electrónico.

El principal uso que daban a esta aplicación consistía en:

  • Cliente de correo

  • Gestor de conocimiento, albergando los registros entrantes y salientes de la oficina, así como la generación de expedientes asociados a estos.

  • Almacenamiento de correos electrónicos (con sus correspondientes adjuntos) relacionados con los registros y expedientes en el gestor de conocimiento.

Con la colaboración de Irontec se remplazó dicho software por una combinación basada en software libre; Zimbra 7.1.1 y una aplicación J2EE a medida bajo Alfresco Community 3.4.0.

 

Aplicación a medida

Alfresco Community 3.4d

Desde Zylk.net tenemos una amplia experiencia con este gestor documental, y aunque nuestra primera aproximación fue desarrollar la aplicación sobre el share de Alfresco, optamos por trabajar sobre un terreno conocido, J2EE, mientras nos familiarizábamos con las tecnologías de Alfresco Share; YUI, Surf, Freemarker, JS avanzado, ...

Aplicación web J2EE

La aplicación web, consta de 2 interfaces para dar servicio a un zimlet y a las peticiones síncronas y asíncronas de la aplicación web.

Desde el core de la aplicación tendremos el módulo Alfresco, que se compondrá de una paquetería para las operaciones CMIS (OpenCMIS) y para aquellas operaciones que requieran del uso de los webscripts a medida, un paquete para la gestión de conexiones HTTP (Apache HTTP Commons)

Desde Alfresco haremos uso, desde el binding Atompub, del servicio CMIS que se nos ofrece.

Como comentamos en anteriores entradas, dado que ciertas funcionalidades no las veíamos cubiertas desde este interfaz, optamos por crearnos webscripts Alfresco a medida.

 

El mapa funcional de la aplicación se podría definir en:

  • Registros

    • Listado de registros E/S disponibles en el sistema, paginados y ordenados, con un buscador simple y otro avanzado, para poder realizar una búsqueda por metadatos.

    • Alta de registro de entrada / salida

    • Detalle de registro E/S

      • Características generales

      • Datos de origen/destino

      • Estado de archivado; revisor, responsable de archivo y registros asociados

      • Archivos e Emails relacionados.

  • Expedientes

    • Listado de expedientes disponibles en el sistema, paginados y ordenados, con un buscador simple y otro avanzado, para poder realizar una búsqueda por metadatos.

    • Detalle del expediente

      • Características generales

      • Registros asociados

      • Archivos e Emails relacionados

 

Os dejamos unas cuantas imágenes de la aplicación.

Creación de un nuevo registro

 

Resultados y buscador simple de registros

 

Búsqueda avanzada de registros

 

Asociación entre un registro y expediente

 

Petaña de revisión en el detalle de un registro

 

Registros asociados a un expediente

 

Pestaña 'Documentos de interés' en el detalle de un expediente, en donde se pueden ver documentos e emails adjuntos

Zimlet

Para la integración del gestor de correo con el gestor documental, desarrollamos junto con Irontec un componente zimlet para Zimbra y mediante una capa intermedia en nuestra aplicación J2EE relacionamos el zimlet y Alfresco.

Migración de datos

Para la migración de datos desde un sistema Lotus ↔ Alfresco, hicimos uso de la librería DIIOP (Domino Internet Inter-Orb Protocol) que nos ofrece el mismo producto, para comunicar aplicaciones Java con el servicio de datos Lotus Domino.

Si como ocurrió en nuestro caso, desconocéis el modelo de datos empleado en la aplicación y este ha sufrido variaciones en el transcurso de su uso, el proceso de migración os resultará algo cansino, ya que sólo podréis conocer el contenido de los documentos (objeto genérico de Lotus) con una iteración de propiedades.

Sin embargo, la API DIIOP es muy utilizable, y apenas tendréis problemas en la parte técnica.

Tras las 38 horas que tardó todo el proceso de migración, conseguimos migrar 27.605 documentos con un peso total aproximado de 20Gb.

Signing PDF documents with Sinadura Mobile

Last week we finished the implementation of a mobile client for android devices in sinadura project (still in beta). We have implemented some of the main features of sinadura Desktop application for PDF documents, like TSA signatures with p12 certificates. Other interesting features are related with the share possibilities of the mobile client with external services like Gmail, Google Docs or Dropbox.

 

The next steps are related with the validation of signatures, the cmis integration with Alfresco respositories, the implemetation of XaDES signatures or even a sync service for the client with a CMIS repository.
 

http://www.slideshare.net/zylk/sinadura-mobile

Formando un perfil "Community manager"

La pasada semana parte del equipo de Zylk acudió a un curso de  "Funciones del comunity manager en la empresa" organizado por Enpresa digitala e impartido por  Miguel Fernández Arrieta de la Universidad de Mondragón.

Miguel nos dió a conocer, los valores de las redes sociales y para que se utilizan, como por ejemplo: el twitter, facebook, youtube,linkedin...etc...

Ahora os cuento un poco mi experiencia en primera persona, ya que acudí al curso.

En este curso nos enseñaron como cuidar la identidad digital de la empresa. Para todo esto, Miguel comenzó  informándonos a cerca de la  importancia en darnos de alta en "alertas de google", y de esta manera ver en todo momento las publicaciones que se realicen con nuestro nombre.

Esto mejorarará la relación de la empresa con las personas y a su vez la propia relación interna.

Nos dió a conocer como utilizar un cliente web, en este caso llamado "hootsuite" con el que  podremos controlar y gestionar, los movimientos en el twitter, facebook y todas las páginas de las redes sociales en las que la empresa se encuentre logeado. Comentaros, que esta herramienta me pareció bastante interesante.

Si realizamos algún otro curso en relación a esto, no dudaré en contároslo. :-)

Mostrando el intervalo 1 - 5 de 150 resultados.
Resultados por página 5
de 30