NASA World Wind 1.4… ¡WOW!

:-)
Wow! Acabo de darle una ojeada a “NASA World Wind 1.4″… Tremenda aplicación la que han desarrollado esta gente, os recomiendo darle una ojeada al video: http://bullsworld.blogspot.com/2007/02/nasa-world-wind-14-released.html

Empieza con un pequeño tour dentro de nuestro sistema solar y luego nos muestra algunas de las características de la aplicación. Y lo mejor de todo es que ha sido totalmente escrita con .NET 2.0, más concretamente ¡con Visual C# Express! :-)

“…it is written using .NET 2.0 which allows for some cool new features but more importantly, thanks to Microsoft allowing developers to use visual C# express for free we were able to easily increase the development team…”

Con esto podemos comprobar que en ocasiones, usando correctamente la materia gris no es necesario usar las herramientas más poderosas (y esto no pasa habitualmente, ya que normalmente tendemos a usar la máxima de “burro grande, ande o no ande”).

Un saludo desde Andorra!

Os dejo con unas imágenes de muestra:

WebParts 2 – Añadiendo un poco más de funcionalidad al WebPart

Continuando con la serie de artículos acerca de la creación de WebParts para Sharepoint Services 3.0, el paso lógico es crear algo más que un simple WebPart que diga “Hola Mundo!” :-) Así que vamos a ponernos manos a la obra: ¿Que tal si primero identificamos a nuestro interlocutor? Si sabemos el nombre del usuario siempre podremos saludarlo y parecer así un poco más educados…

Para realizar esto vamos a agregar una segunda clase en el proyecto anterior MisPrimerosWebParts, de modo que cada WebPart sea un poco más evolucionado que su predecesor:

public class ElSegundo : WebPart
{
    protected override void RenderContents(HtmlTextWriter writer)
    {
        writer.Write(“Hola {0}”, this.Page.User.Identity.Name.ToString());
        base.RenderContents(writer);
    }
}

Bien, aunque no hemos avanzado demasiado por lo menos es un primer paso. Aunque lo que realmente me gustaría es que el usuario pudiese personalizar el saludo y de este modo abordaremos el verdadero propósito de este artículo: La persistencia de propiedades de la clase en Sharepoint Services.

No basta con crear una propiedad en la clase para que pueda ser persistida y representada en Sharepoint Services mediante un control PropertyGridEditorPart, ésta debe implementar una serie de atributos:

Personalizable(PersonalizationScope.Shared / User)

Indica el ámbito de personalización del WebPart. El ámbito Shared significa que los datos de personalización se aplican a todos los usuarios y para todos los controles personalizables de una página, y que también están disponibles para guardarse en la página. Mientras que el ámbito User indica que los datos de personalización específicos del usuario, así como los datos de personalización aplicables a todos los usuarios, se cargan para todos los controles personalizables de una página. Sólo los datos de personalización específicos del usuario pueden guardarse en la página.

WebBrowsable

Indica si la propiedad designada de un control de elementos Web se muestra en un objeto PropertyGridEditorPart.

WebDisplayName(“Nombre de la propiedad”)

Define el nombre descriptivo de una propiedad de un control de elementos Web.

WebDescription(“Descripción de la propiedad”)

Define el valor de cadena que se va a utilizar como información sobre herramientas de una propiedad de un control de elementos Web.

En nuestro caso particular vamos a crear una propiedad “Saludo” que permita almacenar el saludo preferido por el usuario, de modo que la propiedad implemente los atributos descritos anteriormente del siguiente modo:

private string strSaludo = “”

[Personalizable(PersonalizationScope.Shared) ,
WebBrowsable,
WebDisplayName(“Tipo de saludo”),
WebDescription(“Permite personalizar el tipo de saludo”)
]
public string Saludo
{
    get
    {
        if (strSaludo == String.Empty)
        {
        strSaludo = “Hola”;
        }
        return strSaludo;
    }
    set { strSaludo = value; }
}

Ahora podremos utilizar la nueva propiedad en el método “RenderControls” para mostrar correctamente el mensaje al usuario:

protected override void RenderContents(HtmlTextWriter writer)
{
    writer.Write(“{0}, {1}”, Saludo, this.Page.User.Identity.Name.ToString());
    base.RenderContents(writer);
}

Y para terminar, ya que nuestro WebPart posee propiedades personalizadas, vamos a redondearlo permitiendo la exportación de éstas en forma de fichero XML (esto es sumamente sencillo, y basta con agregar una línea de código en el constructor de la clase, indicando en modo de exportación):

public ElSegundo()
{
    ExportMode = WebPartExportMode.All;
}

Ahora si. Una vez hemos terminado, debemos volver a generar nuestro proyecto y seguir los pasos que indicábamos en el artículo anterior. Es decir: copiar el ensamblado en el servidor, añadirlo en la GAC, reiniciar IIS (de hecho sólo es necesario reiniciar los servicios de aquellos sitios de WSS 3.0 dónde se haya desplegado el WebPart, etc…).

Una vez agregado nuestro WebPart a una página podremos observar que podemos editar sus propiedades, y que entre ellas aparece la propiedad creada anteriormente, el valor de la cual podremos modificar y Sharepoint Services se encargará de persistir su valor en la página.

En el próximo artículo mostraremos cómo acceder a una base de datos SQL Server para mostrar información, y de paso como parametrizar la ubicación del servidor (ya sabemos que los servidores a veces nunca se están quietos) y protegernos en caso de un error en tiempo de ejecución mostrando un mensaje personalizado con la excepción.

WebParts 1 – Creando nuestro primer WebPart para Sharepoint Services 3.0

Este pretende ser el primero de varios artículos dedicados a la creación de WebParts para Sharepoint Services 3.0, utilizando Visual Studio 2005 como herramienta y C# como lenguaje de desarrollo. Pero antes de empezar, quiero dar las gracias al colega MVP Carlos Segura (que sabe más que el maestro Yoda y no tiene sus orejas) por su estupendo sitio, que ha sido el culpable de mi adicción a esta estupenda herramienta de colaboración que es Sharepoint.


Empezaremos con la creación un WebPart muy sencillo (el típico “Hola mundo!”), estableceremos los pasos a seguir para su correcta publicación en un Sharepoint, y poco a poco iremos avanzando, ampliando sus funcionalidades:




  • Mostrando la información del usuario autentificado

  • Persistiendo las propiedades del WebPart en Sharepoint Services y permitiendo su exportación.

  • Extendiendo la funcionalidad para acceder a bases de datos

  • Agregando un control de excepciones para obtener información en el servidor de explotación en caso de error.

  • Comunicando con otros WebParts

Realmente la creación y distribución de un WebPart es ahora mucho más sencillo que en versiones anteriores, ya que esta versión está construido sobre ASP.NET 2.0, con lo que se pueden aprovechar todas las nuevas características introducidas.


Así pues para empezar a crear nuestro primer WebPart basta con iniciar un nuevo proyecto “Biblioteca de clases” con Visual Studio 2005, utilizando C# como lenguaje de desarrollo:



Llamaremos a nuestro proyecto MisPrimerosWebParts, y a continuación agegaremos una referencia al ensamblado System.Web, necesario para poder acceder al espacio de nombres WebParts. Esto es de vital importancia ya que todo WebPart que deseemos crear debe heredar de la clase base WebPart.



A continuación, agregaremos los espacios de nombres comentados anteriormente:


using System.Web.UI;
using System.Web.UI.WebControls.WebParts;

Y ya podemos empezar a crear nuestra primera clase derivada de WebPart, destinada a convertirse en el primer WebPart de nuestra colección. Observar que el código resultante queda reducido a la mínima expresión:


namespace MisPrimerosWebParts
{
    public class ElPrimero:WebPart
    {
        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.Write(“Hola mundo!”);
            base.RenderContents(writer);
        }
    }
}


¿Y esto es todo? Pues en lo referente a código si, eso es todo lo que vamos a codificar para este WebPart. Pero para poder ver publicado finalmente este WebPart hay que seguir cuidadosamente una serie de pasos:



  1. Firmar el ensamblado: Del mismo modo que en versiones anteriores debemos firmar el ensamblado, sin embargo esto es ahora mucho más sencillo. Basta con ir a a las propiedades del proyecto (pestaña Firma) y seleccionar que vamos a firmar el ensamblado con una clave nueva. Escribiremos el nombre de fichero que almacenará la firma, y (muy recomendado) protegeremos el archivo de clave usando una contraseña segura. De este modo al compilar la aplicación se creará el nuevo fichero generado con extensión *.pfx que podemos abrir desde Visual Studio para ver la clave que contiene.



  2. Generar la solución (Ctrl+Shift+B) para crear el ensamblado MisPrimerosWebParts.dll y el fichero con la firma MisPrimerosWebParts.pfx (que en principio no volveremos a necesitar).

  3. Añadir el ensamblado a la Global Assembly Cache: Para poder utilizar el WebPart desde varios sitios de Sharepoint Services, vamos a instalar este ensamblado en la Global Assembly Cache (en adelante GAC). El primer paso consiste en copiar este ensamblado en una carpeta local del servidor, por ejemplo C:MisWebParts. A continuación debemos ejecutar la utilidad de línea de comandos Gacutil.exe situada en la ubicación:

    C:%program files%Microsoft Visual Studio 8SDKv2.0Bin

    Para ello abriremos una ventana de consola, nos situaremos en esta ubicación y agregaremos el ensamblado a la GAC de este modo:

    Gacutil -I C:MisWebPartsMisPrimerosWebParts.dll



  4. Registrar esta clase en el web.config como un control seguro: Aunque previamente debemos conocer al public token de nuestro ensamblado, y tal vez el modo más sencillo sea visitando la carpeta dónde se encuentra la GAC (%Windows%Assembly) y comprobando de paso que el assembly se ha instalado correctamente:



    Una vez disponemos del token de nuestro ensamblado, debemos modificar el fichero web.config de nuestro sitio (os recuerdo que habitualmente se encuentra en: C:InetpubwwwrootwssVirtualDirectories%sitio%web.config), agregando este control en la sección “SafeControls” para posteriormente agregarlo a la colección de WebParts del site.



  5. Y por fin, la parte más esperada: vamos a agregar nuestro ensamblado a la lista de elementos web de nuestro sitio. Para ello debemos reiniciar los servicios del IIS (¡muy importante y algo de que solemos olvidarnos a menudo!), abrir la página de configuración del sitio y mostrar la lista de elementos web situada en: Configuración del sitio/Galerías/Elementos Web. Aquí encontraremos todos los WebParts disponibles para añadir a las páginas de Sharepoint Services pero sin embargo nuestro nuevo y flamante WebPart no aparece. Para que aparezca hay que añadirlo manualmente a la lista mediante la opción “Nuevo”, que nos mostrará todos los elementos contenidos en los controles de la sección “SafeControls” del web.config, marcar el elemento y también la opción “¿Sobrescribir si el archivo ya existe?” (por si acaso no es la primera vez que lo añadimos), pulsamos el botón “Llenar galería” y ¡voilà!, ¡Hemos terminado!

  6. Ahora ya podemos ir al diseño de la página en la que queramos insertar el WebPart y agregarlo desde la lista de elementos disponibles. El resultado debería ser algo similar a esto:


Bien, la primera conclusión que sacamos es que da bastante más trabajo la publicación de un WebPart que la creación propiamente dicha, no es así? Sin embargo, el resultado obtenido bien merece la pena.


En los próximos artículos iremos extendiendo la funcionalidad de este WebPart para hacerlo más complejo, ¡hasta entonces!