lunes, 27 de septiembre de 2010

Manejadores de eventos en SharePoint 2010 con Visual Studio 2010 (revista CompartiMOSS)

image Este artículo lo escribí originalmente para la revista CompartiMOSS gracias a una invitación de Fabián Imaz.

Les recomiendo ampliamente esta revista que pueden accederla desde este enlace:

http://www.gavd.net/servers/compartimoss/compartimoss_main.aspx 

o desde su página en Facebook:

http://www.facebook.com/group.php?gid=128911147140492&v=wall&viewas=0#!/group.php?gid=128911147140492&ref=ts.

Que les sea útil!

Introducción

Los manejadores de eventos constituyen una de las tantas características que SharePoint 2010 posee a la hora de extender una aplicación mediante programación. En lo personal, estoy convencido de que la mejor forma de potenciar SharePoint es aprovechando al máximo las funcionalidades que la plataforma nos ofrece out of the box y reservar la programación para los casos en que se justifique. De esta manera obtendremos aplicaciones más robustas, en menos tiempo, con menor costo y menos propensas a errores.

Bajo este punto de vista, considero que los manejadores de eventos nos ofrecen una funcionalidad con una muy buena relación costo-beneficio, ya que son sencillos de programar y a cambio nos ofrecen funcionalidad más que interesante.

¿Para qué necesitamos un manejador de eventos? En principio debemos entender que los manejadores de eventos agregan comportamiento a listas e ítems (entre otras entidades). Se ejecutan automáticamente como respuesta a un evento como agregar una columna en una lista o modificar un ítem en una lista. Los usos más comunes, según mi opinión, son:

1. Validaciones de datos, previas a la transacción de alta o modificación de un ítem (lo que no podemos resolver con la nueva funcionalidad de SharePoint 2010: Custom Validation).

2. Control de integridad para fortalecer las reglas de negocio que no pueden ser manejadas con los campos de búsqueda (lookup).

3. Control de unicidad de columnas o conjunto de columnas (lo que no podemos resolver con la nueva funcionalidad de SharePoint 2010: Enforce unique values ).

4. Ejecución de procesos de negocio, acciones que puedan ser automatizadas y que no necesiten intervención de un usuario (en cuyo caso quizá sea más acertado programar un flujo de trabajo)

Intro

5. Lo que no puede resolver un campo calculado: con eventos disponemos de toda la potencia de .Net para calcular en forma automática el valor de nuestras columnas.

6. Protección de la parametrización, al impedir, por ejemplo, que un usuario con permisos de administración pueda eliminar una columna de una lista.

7. Controles en la seguridad, útil cuando necesitamos aplicar (o controlar) determinados permisos sobre un ítem basados en un elemento dinámico como un dato en una columna (u otra regla de negocio más sofisticada).

Si me permiten la simplificación, creo que la mejor manera que tiene el lector de comprender qué es un manejador de eventos es recordar lo que nos ofrecen los triggers de un sistema de base de datos relacional.

Eventos en SharePoint 2010

En la sección anterior enumeré ideas de problemáticas que podemos resolver con los manejadores de eventos, pero para entender la potencialidad de esta funcionalidad, lo primero que necesitamos es conocer la lista de eventos que soporta SharePoint 2010, que a continuación enumero:

Eventos de lista

· Columnas: creación, eliminación y modificación.

· Listas: creación y eliminación.

Eventos de ítem lista

· Ítem: creación, eliminación, modificación y protección.

· Archivos adjuntos: creación y eliminación.

· Archivos: movimiento y conversión.

· Recepción de un evento de contexto de lista.

Eventos de e-mail

· Recepción de mensaje de e-mail.

Eventos de web

· Colección de sitios: eliminación.

· Sitio: aprovisionamiento, eliminación y movimiento.

Eventos de flujo de trabajo

· Comienzo, suspensión y desactivación.

Eventos de característica

· Activación, desactivación, instalación y desinstalación y modificación.

Intro_After_Before

Tipos de eventos

En casi todos los casos existen dos tipos de eventos, los que se ejecutan antes (before) de que se efectúe la confirmación de la transacción en la base de datos de contenido (terminan en “ing”) y los que se disparan después (after) de que se ejecute la confirmación (terminan en “ed”). Los primeros son sincrónicos y los segundos a-sincrónicos en forma predeterminada.

  • Los eventos after no admiten cancelación por parte del usuario.
  • Los eventos asincrónicos se ejecutan en un thread distinto.
  • SharePoint 2010 posee una nueva propiedad que permite alterar el tipo de sincronización del evento (sólo en los eventos after): eventReceiver.Synchronization.

Ejemplo en Visual Studio 2010

Afortunadamente, Visual Studio 2010 nos ofrece un entorno de desarrollo totalmente integrado con SharePoint 2010. En la versión de 2007, necesitábamos realizar mucho trabajo manual, que ahora se ve reemplazado por un amigable asistente. Nuestro primer paso será crear un proyecto de tipo Event receiver tal como indica la figura:

Visual_New

Luego elegimos nuestro sitio y si se trata de una solución standboxed o farm. La siguiente pantalla nos permite elegir el tipo de evento (ítem de lista en nuestro caso) y la fuente (Anuncios en nuestro caso) tal como muestra la siguiente imagen:

Visual_EventType

Al finalizar el asistente nos genera automáticamente una solución con las referencias y clases correspondientes, quedando de nuestro lado escribir el código personalizado.

using System;

using System.Security.Permissions;

using Microsoft.SharePoint;

using Microsoft.SharePoint.Security;

using Microsoft.SharePoint.Utilities;

using Microsoft.SharePoint.Workflow;

namespace EventReceiverProject1.EventReceiver1

{

    /// <summary>

    /// List Item Events

    /// </summary>

    public class EventReceiver1 : SPItemEventReceiver

    {

       /// <summary>

       /// An item is being updated.

       /// </summary>

       public override void ItemUpdating(SPItemEventProperties properties)

       {

base.ItemUpdating(properties);

       }

    }

}

Ahora que tenemos el esqueleto armado, haremos un ejemplo para entender cómo funciona el manejador de eventos. Vamos a implementar una sencilla regla de negocio: los anuncios de nuestra librería Announcements sólo pueden ser modificados los días miércoles.

Crearemos un evento que valide que la acción de modificación se esté realizando ese día. Para ello agregamos las siguientes líneas de código dentro del esqueleto que nos había construido el asistente de Visual Studio 2010:

DateTime Ahora = DateTime.Now;

string Dia = Ahora.ToString("ddd");

if (Dia != "Wed") {

  properties.Status = SPEventReceiverStatus.CancelWithError;

  properties.ErrorMessage = "Los anuncios sólo pueden ser modificados los miércoles";

  properties.Cancel = true;

}

Como nuestro evento es de tipo before la validación se ejecutará antes de que la modificación se confirme en la base de datos de contenido, permitiendo cancelar la operación e informar mediante un error lo sucedido al usuario.

Para desplegar el evento en nuestro ambiente de desarrollo, el siguiente paso es presionar F5. Visual Studio 2010 nos abrirá Internet Explorer con nuestro sitio cargado, herramientas de debug incluidas. J. Buscamos la lista de anuncios, elegimos uno e intentamos la acción de modificación:

Sitio_Update

Como en nuestro ejemplo, la acción se está ejecutando un viernes, el evento cancelará la edición y generará el siguiente mensaje de error:

Error

Conclusión

En este artículo vimos una introducción rápida a la característica de programación de manejadores de eventos en SharePoint 2010 y sus posibles usos.

Luego vimos un ejemplo muy sencillo con el objetivo de transmitir al lector tranquilidad respecto al costo de programación asociado. Además vimos como Visual Studio 2010 nos ayuda notoriamente en el trabajo con SharePoint a través de sus asistentes y facilidades para desplegar.

Espero que esta herramienta sea de utilidad para aquellos que necesiten extender SharePoint, especialmente programando reglas de negocio.

En caso que tu plataforma sea SharePoint 2007, también puedes programar manejadores de eventos con un poco más de esfuerzo y algunas limitaciones en cuanto a los eventos disponibles. Si este es tu caso, te dejo un enlace con un artículo y webcast que dicté sobre eventos en WSS 3.0: http://surpoint.blogspot.com/2009/12/manejadores-de-eventos-en-sharepoint.html.

Como siempre, espero haber sido útil. ¡Hasta la próxima!

0 comentarios:

Publicar un comentario en la entrada