Conexión con Alfresco usando DOTCMIS

Objetivo

Desarrollar en C# método que nos permita realizar una conexión con Alfresco usando la librería DOTCMIS.

Paso 1:

Descargar la librería DOTCMIS.

Paso 2:

Agregar la librería DOTCMIS en nuestro proyecto.



Paso 3:

Crear una clase llamada: "CMISIntegrationRepository" de acceso público.

Paso 4:

Agregar las siguientes referencias
using DotCMIS;
using DotCMIS.Client.Impl;
using DotCMIS.Client;
using DotCMIS.Data.Impl;
using DotCMIS.Data.Extensions;
using System.Configuration;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using DotCMIS.Data; 

Paso 5:

Creamos una variable global para toda la clase, estática y privada. Del siguiente modo:
private static ISession session = null;

Paso 6:

Creamos un método llamado: "CreateConnection" de acceso privado

private void CreateConnection()
{
      try
      {
           /*Sí la variable session es igual a null, llamo al método Connect para crear una y asignarse la  a dicha variable*/
           if (session == null)
          {
              /*Obtengo el nombre de usuario, password,reposityId y la url del servicio*/
              string UserName = System.Configuration.ConfigurationManager.AppSettings["CMISUserName"].ToString();
              string Password = System.Configuration.ConfigurationManager.AppSettings["CMISPassword"].ToString();
              string RepositoryId = System.Configuration.ConfigurationManager.AppSettings["RepositoryId"].ToString();
              string ServicesUrl = System.Configuration.ConfigurationManager.AppSettings["ServicesUrl"].ToString();

              /*Llamo al método Connect pasando le los parametros necesarios para crear la sesión*/
              session = Connect(UserName, Password, ServicesUrl,RepositoryId);
          }
      }
      catch(Exception error)
      {
          /*En caso de algún error, lanzo una excepción*/
          throw new Exception("Ha ocurrido un error al tratar de conectarse al servicio.",error);
      }
}

Paso 7:

Creamos el método "Connect" de acceso privado que recibirá cuatro parametros:
  • user: Usuario para conectarse a Alfresco.
  • password: Password para del usuario.
  • servicesUrl: URL del servicio de CMIS (Ejemplo: https://host:port/alfresco/cmisws/)
  • repositoryId: Id del repositorio. (Pueden obtener lo en la siguiente dirección: https://host:port/alfresco/service/cmis/index.html)
 private ISession Connect(string user, string password, string servicesUrl, string repositoryId)
{
    /*Esto resuelve un problema con los certificados SSL cuando son auto autentificados.*/
    /*No recomendable para ambientes de producción*/
    ServicePointManager.ServerCertificateValidationCallback = delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

    IDictionary<string, string> parameter = new Dictionary<string, string>();

    parameter.Add(DotCMIS.SessionParameter.User, user);
    parameter.Add(DotCMIS.SessionParameter.Password, password);
    parameter.Add(DotCMIS.SessionParameter.BindingType, DotCMIS.BindingType.WebServices);
    parameter.Add(DotCMIS.SessionParameter.WebServicesAclService, (servicesUrl + "ACLService?wsdl").ToString());
    parameter.Add(DotCMIS.SessionParameter.WebServicesDiscoveryService, (servicesUrl + "DiscoveryService?wsdl").ToString());
    parameter.Add(DotCMIS.SessionParameter.WebServicesMultifilingService, (servicesUrl + "MultiFilingService?wsdl").ToString());
    parameter.Add(DotCMIS.SessionParameter.WebServicesNavigationService, (servicesUrl + "NavigationService?wsdl").ToString());
    parameter.Add(DotCMIS.SessionParameter.WebServicesObjectService, (servicesUrl + "ObjectService?wsdl").ToString());
    parameter.Add(DotCMIS.SessionParameter.WebServicesPolicyService, (servicesUrl + "PolicyService?wsdl").ToString());
    parameter.Add(DotCMIS.SessionParameter.WebServicesRelationshipService, (servicesUrl + "RelationshipService?wsdl").ToString());
    parameter.Add(DotCMIS.SessionParameter.WebServicesRepositoryService, (servicesUrl + "RepositoryService?wsdl").ToString());
    parameter.Add(DotCMIS.SessionParameter.WebServicesVersioningService, (servicesUrl + "VersioningService?wsdl").ToString());
    parameter.Add(DotCMIS.SessionParameter.RepositoryId, (repositoryId));
  
    /*Configuro el tiempo valido para lecturas*/
    /*Esta configuración la obtengo desde el archivo de configuración (web.Config)*/
    parameter.Add(DotCMIS.SessionParameter.ReadTimeout, System.Configuration.ConfigurationManager.AppSettings["ReadTimeout"].ToString());//infinito
  
    /*Obtengo el tamaño del mensaje*/
    /*Esta configuración la obtengo desde el archivo de configuración (web.Config)*/
    parameter.Add(DotCMIS.SessionParameter.MessageSize, System.Configuration.ConfigurationManager.AppSettings["MessageSize"].ToString());//20mb
  
    ISessionFactory factory = DotCMIS.Client.Impl.SessionFactory.NewInstance();
  
    return factory.CreateSession(parameter);
}

Paso 8:

Para limpiar la sesión, creamos un método llamado: "CloseConnection" de acceso privado.
private void CloseConnection(ISession session)
{
    try
    {
        /*Sí la sesión es distinto a null, la limpio. En caso contrario no hago nada*/
        if (session != null)
        {
            session.Clear();
        }
    }
    catch(Exception error)
    {
        /*En caso de algún error, lanzo excepción*/
        throw new Exception("Ha ocurrido un error al cerrar la conexión.", error);
    }
}

Paso 9:

Para comunicar nos con nuestra clase y los métodos alojados en ella; creamos un método tipo constructor con el mismo nombre de la clase "CMISIntegrationRepository"

public CMISIntegrationRepository()
{
    CreateConnection();
}

Conclusión

Con esta clase podremos conectarnos vía CMIS a Alfresco, mediante la librería DOTCMIS. La idea es no crear una sesión a cada rato; por lo tanto sí guardamos la sesión en una variable estática y privada a la clase; y mediante el método "CreateConnection" que usamos para verificar sí es null o no; nos aseguramos de crear una sesión solo cuando así lo necesitemos.

En otra entrada, les explicaré como realizar búsquedas y lecturas de documentos desde nuestra aplicación hacía Alfresco.

Les comparto una imagen con el diagrama de funcionamiento de esta clase y sus métodos.






Comentarios