lunes, 15 de marzo de 2010

XSD2Code Generator

XSD2Code Generator es una herramienta que nos permite generar business class a partir de schemas xml (ficheros .xsd). Es una evolución de la herramienta xsd.exe que viene con nuestra instalación de visual studio.

Cómo características a resaltar respecto a la herramienta xsd.exe es que soporta generics y custom collections. Cuando generamos classes con xsd, xsd.exe nos generaba clases con atributos del tipo array, mientras que xsd2code nos genera clases con propiedades del tipo List. Además se nos añade como un Addin para visual studio 2008.


Un ejemplo bien secillo de su uso sería el siguiente:


1. Obtener o generar un xml para el que queremos generar la classe que lo serialize / deserialize.







foo1
foo2


foo1
foo2





2. Generar el schema (fichero .xsd) Menú XML > Create Schema, se nos generará un archivo cómo el siguiente.






























3. Por último hacemos botón derecho sobre el fichero .xsd desde el solution explorer y pulsamos la opción Run xsd2code generation. Se nos abrirá una ventana modal donde podemos elegir las propiedades para la generación del código, como por ejemplo el lenguaje, si queremos una clase base, etc. A continuación muestro un trozo de código generado con esta herramienta.




using System;
using System.Diagnostics;
using System.Xml.Serialization;
using System.Collections;
using System.Xml.Schema;
using System.ComponentModel;
using System.Collections.Generic;

namespace prueba {

public partial class FooClass {

private List fooSubClassesField;

private string attribute1Field;

public FooClass() {
this.fooSubClassesField = new List();
}

[System.Xml.Serialization.XmlArrayItemAttribute("FooSubClass", IsNullable=false)]
public List FooSubClasses {
get {
return this.fooSubClassesField;
}
set {
this.fooSubClassesField = value;
}
}

public string Attribute1 {
get {
return this.attribute1Field;
}
set {
this.attribute1Field = value;
}
}
}

public partial class FooClassFooSubClass {

private string field1Field;

private string field2Field;

public string field1 {
get {
return this.field1Field;
}
set {
this.field1Field = value;
}
}

public string field2 {
get {
return this.field2Field;
}
set {
this.field2Field = value;
}
}
}
}

martes, 9 de marzo de 2010

ListInstance (FeatureId y TemplateType)

Cuando estamos creando una feature para provisionar una lista a nuestra solución MOSS (Element ListInstance), aparecen dos campos de suma importancia:

FeatureId: Text obligatorio. Especifica el identificador GUID de la característica. Si no se especifica un GUID de característica, Windows SharePoint Services usa el identificador de la característica predeterminada; en otras palabras, el que contiene el elemento ListInstance. Si la plantilla de lista para la instancia de lista se encuentra dentro de otra característica, se debe especificar el identificador de dicha característica mediante el atributo FeatureId.

TemplateType: Integer obligatorio. Devuelve el identificador del entero de la plantilla de lista que se va a usar.

La siguiente tabla muestra las listas disponibles en MOSS (algunas también en WSS) , sus Type IDS y sus GUIDS.

Type ID
Description

GUID of feature

100

Generic list00bfea71-de22-43b2-a848-c05709900100

101

Document library00BFEA71-E717-4E80-AA17-D0C71B360101

102

Survey00BFEA71-EB8A-40B1-80C7-506BE7590102

103

Links list00BFEA71-2062-426C-90BF-714C59600103

104

Announcements list00BFEA71-D1CE-42de-9C63-A44004CE0104

105

Contacts list00BFEA71-7E6D-4186-9BA8-C047AC750105

106

Events list00BFEA71-EC85-4903-972D-EBE475780106

107

Tasks list00BFEA71-A83E-497E-9BA0-7A5C597D0107

108

Discussion board00BFEA71-6A49-43FA-B535-D15C05500108

109

Picture library00BFEA71-52D4-45B3-B544-B1C71B620109

110

Data sources00BFEA71-F381-423D-B9D1-DA7A54C50110

111

Site template gallerySYSTEM

113

Web Part gallerySYSTEM

114

List template gallerySYSTEM

115

XML Form library00BFEA71-1E1D-4562-B56A-F05371BB0115

116

Masterpage and page layouts librarySYSTEM

117

No-code workflow library00BFEA71-F600-43F6-A895-40C0DE7B0117

118

Workflow process list00BFEA71-2D77-4A75-9FCA-76516689E21A

119

Web page library00BFEA71-C796-4402-9F2F-0EB9A6E71B18

120

Custom grid for a list00BFEA71-3A1D-41D3-A0EE-651D11570120

130

Data connection library00BFEA71-DBD7-4F72-B8CB-DA7AC0440130

140

Workflow history list00BFEA71-4EA5-48D4-A4AD-305CF7030140

150

Gantt tasks list00BFEA71-513D-4CA0-96C2-6A47775C0119

1100

Issue tracking00BFEA71-5932-4F9C-AD71-1557E5751100



IISAPP.VBS en Windows Server 2008

En Windows 2003 Server y IIS 6 disponiamos de un magnifico script para determinar el ID de un worker process, iisapp.vbs, de esta forma poder atacharlo en Visual Studio para debugar.

Para más información ver:

http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/b8721f32-696b-4439-9140-7061933afa4b.mspx?mfr=true

En Windows Server 2008 y IIS 7 esta utilidad ya no existe, pero tenemos otros comandos que nos ofrecen la misma funcionalidad:

%windir%\system32\inetsrv\appcmd.exe list wp

lunes, 1 de marzo de 2010

MOSS 2007: Cómo customizar la página de creación de una lista

Es posible modificar la página de creación de una lista, es decir, la página donde especificamos nombre de la lista, descripción, etc.



Pero la idea, no seria modificar esta página directamente, pues pertenece al core de moss.

Lo ideal seria crear una nueva definición de lista, y a esta nueva definición de lista indicarle nuestra propia página de creación, dónde podamos especificar los datos que nos sean de utilidad.

Para ello disponemos de un atributo, NewPage, en el listtemplate:







Name="indexlist"

Type="10010"

BaseType="0"

OnQuickLaunch="TRUE"

SecurityBits="11"

Sequence="410"

DisplayName="Index List"

Description="F4EDocs index list template"

NewPage="F4E.F4EDocs/NewIndexList.aspx"

Image="/_layouts/images/itgen.gif"/>





Luego tendremos que crear nuestra application page, podriamos partir de la existente en /_layouts/new.aspx, y añadir el comportamiento que deseemos, esta application page tendría que derivar de Microsoft.SharePoint.ApplicationPages.LayoutsPageBase.

Un ejemplo de esto se explica en:

http://furuknap.blogspot.com/2009/01/consuming-rss-or-atom-feed-in.html