Una de las novedades (como ya habréis leído, oído, probado,…) de WSSv3 es la posibilidad de crear workflows que nos permitan gestionar contenidos, integrarnos con otras aplicaciones, etc. Para definir estos workflows, tenemos dos herramientas tan distintas como son Sharepoint Designer 2007 (SD 2007, Technical Refresh) y Visual Studio 2005 (con las extensiones de Windows Workflow Foundation y las correspondientes plantillas de definición de workflows para WSS, disponibles con el starter kit de la beta 2). En este post os mostraré como podemos crear el mismo workflow con ambas herramientas, y como la forma de definición, modelado y despliegue del mismo son diferentes, pero conducen al mismo resultado. El workflow que crearemos consistirá en enviar un e-mail al responsable de gestionar los eventos del calendario de nuestra organización cada vez que se cree un ítem en él. Empecemos.
Creación del workflow con SD 2007
Tras abrir nuestro sitio WSSv3 con SD 2007, vamos al menú contextual de creación de workflows con lo que se abrirá un wizard para la definición del workflow. Le damos un nombre a la instancia de workflow, seleccionamos la lista de WSSv3 que nos interese (en este caso Calendar) y marcamos la opción de que nuestro workflow se inicie de modo automático.
Lo siguiente que haremos es configurar que tiene qué hacer nuestro workflow, en este caso enviar un e-mail cada vez que se cree una nueva entrada en el caledario. Como no vamos a definir ninguna condición para el envío del e-mail, lo único que tenemos que hacer es definir una acción (actividad en VS) de envío de e-mail.
Configuramos adecuadamente el e-mail a enviar cuando se cree el ítem en el calendario: destinatario del e-mail, subject, y el cuerpo del e-mail (en el ejemplo he añadido algunos campos del ítem utilizando la opción Añadir Campos de Búsqueda que nos ofrece SD 2007). Una vez configurado el workflow, probamos que funciona correctamente (botón Comprobar flujo de trabajo) y lo desplegamos contra nuestro sitio WSS (botón Finalizar), y ya tendemos vinculado el workflow con la lista Calendar de nuestro sitio.
Creación del workflow con VS 2005
Para crear el workflow anterior en VS 2005 dentro de la sección de C# escogemos de tipo Windows Sharepoint Services, y seleccionamos la plantilla adecuada (Sharepoint Sequential Workflow Library en este caso, puesto que estamos modelando un workflow de tipo secuencial).
Una vez creado el proyecto, abrimos el archivo workflow1.cs que nos permitirá modelar nuestro workflow de manera visual, así como acceder a la vista de código para definir su comportamiento. Al abrir este fichero, vemos que por defecto ya tenemos una actividad agregada, OnWorkflowActivated, que es la actividad de inicio del workflow. Lo siguiente que haremos será añadir la actividad de envío de e-mail sin más que seleccionarla en la toolbox y arrastrarla a la ubicación correcta en la superficie de diseño (debajo la actividad de inicio).
La actividad de envío de e-mail la tendremos que configurar para que tenga el mismo CorrelationToken que la actividad de inicio y establecer de esta manera el canal de ejecución del workflow. Además, para esta actividad también configuraremos las propiedades Header y Body (bien en modo visual o en la vista de código) para posteriormente definir el e-mail a enviar. Una vez configurado el workflow en modo diseño, tenemos que definir su comportamiento en la vista de código (a través de los Handlers de cada actividad). Este sería el código de los handlers de las actividades del workflow:
//Manejador actividad de inicio del workflow.
private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
{
workflowId = workflowProperties.WorkflowId; //inicializamos el identificador del workflow
}
//Manejador que envía gestiona el envio del e-mail
private void sendEmail1_MethodInvoking(object sender, EventArgs e)
{
//Variables que contendrán la información a enviar en el e-mail!
string starttime = "";
string endtime = "";
string description = "";
//Elementos de WSSv3
SPSite site = new SPSite("http://localhost");
SPWeb web = site.OpenWeb();
SPList list = web.Lists["Calendar"];
SPListItemCollection listcollection = list.Items;
foreach (SPListItem listitem in listcollection)
{
if ((string)listitem["Title"] == (string)workflowProperties.Item["Title"])
{
for (int i = 0; i < listitem.Fields.Count; i++)
{
SPField campo = listitem.Fields[i] ;
if (campo.InternalName == "EventDate"
|| campo.InternalName == "EndDate"
|| campo.InternalName == "Description")
{
if (listitem[campo.InternalName] != null)
{
//Fecha de inicio del evento
if (campo.InternalName == "EventDate")
{
starttime = listitem[campo.InternalName].ToString();
}
//Fecha de fin del evento
if (campo.InternalName == "EndDate")
{
endtime = listitem[campo.InternalName].ToString();
}
//Descripción del evento
if (campo.InternalName == "Description")
{
description = listitem[campo.InternalName].ToString();
}
}
}
}
}
}
//Configuramos el e-mail a enviar!
cabecerasEmail.Add("To", "jcgonzalez@ciin.es");
cabecerasEmail.Add("Subject", "Nuevo evento en el calendario!");
cabecerasEmail.Add("From", workflowProperties.OriginatorEmail);
cuerpoEmail = "Se ha programado un nuevo evento en el calendario: " + workflowProperties.Item["Title"] +
". Características del evento: <br>" + description + "<br>" +
"La duración del evento será de " + starttime + " a " + endtime + ".";
}
Lo siguiente que tenemos que hacer es compilar nuestro assembly, firmarlo (puesto que para poder desplegarlo en WSS es condición indispensable) y ya estamos listos para desplegarlo (lo haremos como una feature, que es la opción que nos da por defecto VS 2005) en el sitio de WSSv3, para ello tenemos que realizar los siguientes pasos:
§ Configurar el fichero de feature adecuadamente (tiene que referenciar al fichero de manifiesto del workflow).
§ Configurar el fichero de manifiesto, siendo la sección más importante la siguiente:
<Workflow
Name="Ejemplo de Workflow secuencial"
Description="Ejemplo de workflow que crea una tarea de revisión."
Id="FE543FCF-DCB3-41b5-BA88-4C783C6C0B43"
CodeBesideClass="VS2005_WSS_Sequential_Workflow.Workflow1"
CodeBesideAssembly="VS2005_WSS_Sequential_Workflow, Version=3.0.0.0, Culture=neutral, PublicKeyToken=67c7fb61eb566506">
<Categories/>
§ Configurar adecuadamente el archivo de instalación de la feature para que registre el assembly en la caché del servidor de WSSv3, instale la feature y la active.
Si todo ha ido bien, tendremos disponible nuestro workflow en el sitio de WSSv3. Para comprobarlo, vamos a asociar el workflow a la lista de tipo calendario (a través de List Settings -> Workflows Settings) de WSS.
Una vez creada la instancia del workflow, veremos como en la lista Calendar tenemos dos workfows disponibles.
Probando los workflows
Para probar los workflows, basta con que creemos un nuevo elemento en el calendario y comprobemos que nos llegan dos e-mails avisándonos de que tenemos un nuevo evento en el mismo.
Finalmente, para cerrar el post os pongo una comparativa de las implicaciones de modelar workflows con SD 2007 o VS 2005.
Worflows diseñados con el Diseñador VS 2005
|
Workflows diseñados con SD 2007
|
Se pueden escribir workflows para WSS o MOSS.
|
Se pueden escribir workflows para WSS o MOSS.
|
Los archivos de código permiten escribir código customizado para modelar procesos de negocio.
|
El fichero de reglas de workflow encapsula los procesos de negocio.
|
Se pueden asociar a múltiples sitios y listas.
|
Sólo se pueden asociar a una única lista en tiempo de diseño.
|
Los distintos ficheros que componen el workflow se compilan en un assembly.
|
Los distintos ficheros que componen el workflow se almacenan sin compilar en una librería de documentos específica de WSS.
|
El workflow (template) ha de estar asociado con cada lista o elemento en que debe estar disponible.
|
La asociación se da en el momento en que se crea el workflow en una cierta lista.
|
Se puede usar cualquier tipo de formulario: ASPX o InfoPath.
|
Solo se pueden utilizar formularios de tipo ASPX.
|
Worflows diseñados con el Diseñador VS 2005
|
Workflows diseñados con Sharepoint Designer 2007
|
Se pueden incluir modificaciones en el workflow
|
No permite incluir modificaciones en el workflow.
|
Se puede crear actividades customizadas.
|
Sólo se pueden usar las actividades disponibles
|
El assembly y definición del workflow se empaquetan como una feature de WSS, y luego se despliegan en el sitio (manual).
|
El despliegue es realizado de forma automática.
|
Se puede usar un formulario de inicialización para recoger información del usuario cuando se arranca el workflow.
|
Se puede usar un formulario de inicialización para recoger información del usuario cuando se arranca el workflow.
|
Se pueden usar formularios customizados para interactuar con tareas de WSS.
|
Se pueden usar formularios customizados para interactuar con tareas de WSS.
|
Disponible debugging de VS.
|
No es posible el modo debugging.
|
Se pueden crear workflows secuenciales y de máquina de estados.
|
Sólo se pueden crear workflows de tipo secuencial.
|
Bueno, puesto esto ha sido todo. Espero que el post os resulte de utilidad.